Ruby 中$开头的全局变量、内部变量、隐藏变量介绍

编程入门 行业动态 更新时间:2024-10-12 16:22:56

ruby 中充满了一系列的隐藏变量,我们可以从这些预定义的全局变量中获取一些有意思的信息。

全局进程变量

$$ 表示当前运行的 ruby 进程。复制代码 代码如下:>> $$=> 17170我们可以从当前进程杀死它自己复制代码 代码如下:>> `kill -9 #{$$}`[1] 17170 killed irb$? 表示最近一个子进程的状态复制代码 代码如下:>> `echo hello`=> "hello\n">> $?=> #<process::status: pid 18048 exit 0>>> $?.success?=> true

异常和错误

$1 表示引起异常的信息。比如在这里 raise "there's no peanut butter",它的值就是 there's no peanut butter。复制代码 代码如下:>> begin raise "this town ain't big enough for the both of us" rescue puts $! endthis town ain't big enough for the both of us=> nil$@ 可以给出完整的引起错误的栈调用信息,它是一个数组。复制代码 代码如下:>> begin raise 'no soup in kitchen' rescue $@.each { |trace| puts trace } end(irb):13:in `irb_binding'/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/workspace.rb:80:in `eval'/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/workspace.rb:80:in `evaluate'/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/context.rb:254:in `evaluate'/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:159:in `block (2 levels) in eval_input'/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:273:in `signal_status'/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:156:in `block in eval_input'/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:243:in `block (2 levels) in each_top_level_statement'/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `loop'/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `block in each_top_level_statement'/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `catch'/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `each_top_level_statement'/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:155:in `eval_input'/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:70:in `block in start'/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:69:in `catch'/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:69:in `start'/home/meck/.rvm/rubies/ruby-1.9.3-p194/bin/>>'=> ["(>>'"]

字符串和分隔符

$; 表示 string.split 里的分隔符,默认是空格。复制代码 代码如下:>> "one spaceship, two tiny tanks, three misplaced socks".split=> ["one spaceship", " two tiny tanks", " three misplaced socks"]>> $; = ","=> ",">> "one spaceship, two tiny tanks, three misplaced socks".split=> ["one spaceship", " two tiny tanks", " three misplaced socks"]$, 用在 array.join 和 kernel.print 里,默认是 nil。

>> ['one', 'two', 'three', 'green'].join=> "onetwothreegreen">> $, = "-"=> "-">> ['one', 'two', 'three', 'green'].join=> "one-two-three-green"$/ 表述读取输入的行分隔符。它被用在 kernel.gets 里。它通常表示新行,但可以被修改。这个很难展示,因为 irb 依赖 \n 作为读取分隔符,如果把 $/ 设置成 nil,gets 就会读取整个文件。

$\ 正好相反,它是作为输出的行分隔符。复制代码 代码如下:>> $\ = "mooooooo "=> "mooooooo ">> puts anameerror-: -undefined local variable or method `a' for main:object-mooooooo from (irb):25 from /home/meck/.rvm/rubies/ruby-1.9.3-p194/bin/>>'-mooooooo >> a

文件

假设有个叫letter.text的文件:复制代码 代码如下:dear caroline,i think we need some honey for tea.i also think that i may have misplaced my red tie, have you seen it?

-nick$. 表示文件当前被读取的行号。复制代码 代码如下:>> open('letter.txt').each { |line| puts "#{$.}: #{line}" }1: dear caroline,2: i think we need some honey for tea.3: i also think that i may have misplaced my red tie, have you seen it?4:5: -nick=> #<file:letter.txt>$_ 表示最后读取的行。复制代码 代码如下:>> open('letter.txt').each { |line| puts $_.nil? }truetruetruetruetrue=> #<file:letter.txt>

匹配和正则表达式

$~ 表示最近一次正则匹配到的信息,如果有的话它就返回 matchdata 的示例,否则就是 nil。复制代码 代码如下:>> "the robots are coming, the robots are coming, the robots are coming" =~ /ro/=> 4>> $~=> #<matchdata "ro">>> $~.to_s=> "ro">> "the robots are coming, the robots are coming, the robots are coming" =~ /cats/=> nil>> $~$& 跟 $~ 非常相似,它返回最近一次匹配到的字符串。复制代码 代码如下:>> "the robots are coming, the robots are coming, the robots are coming" =~ /ro/=> 4>> $&$' 表示匹配不分后面的字符串。复制代码 代码如下:>> "there were once ten tin robots standing in a row." =~ /robot/=> 24>> $'=> "s standing in a row."=> "ro"=> nil

其他

$> 表示ruby 默认的输出对象,用在 kernel.print 里。复制代码 代码如下:>> $> = $> = $stderr=> #<io:<stderr>>>> puts 'no no no'no no no=> nil>> $> = $stdin/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:168:in `write': not opened for writing (ioerror) from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:168:in `print' from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:168:in `block (2 levels) in eval_input' from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:273:in `signal_status' from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:156:in `block in eval_input' from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:243:in `block (2 levels) in each_top_level_statement' from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `loop' from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `block in each_top_level_statement' from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `catch' from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `each_top_level_statement' from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:155:in `eval_input' from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:70:in `block in start' from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:69:in `catch' from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:69:in `start' from /home/meck/.rvm/rubies/ruby-1.9.3-p194/bin/irb:12:in `<main>'$* 可能是最常用全局变量,它表示包含传给 ruby 文件的所有变量的数组,假设有个叫 argument_echoer.rb 文件:复制代码 代码如下:$*.each { |arg| puts arg }运行它:复制代码 代码如下:$ ruby argument_echoer.rb who what when where and whywhowhatwhenwhereandwhy

  • 0
  • 0
  • 0
  • 0
  • 0

更多推荐

Ruby 中$开头的全局变量、内部变量、隐藏变量介绍

本文发布于:2023-06-11 00:12:51,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/621996.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:变量   开头   全局变量   Ruby

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!