符号序列“#$”在Ruby中意味着什么,在哪里使用它?

时间:2013-03-02 15:27:52

标签: ruby

the book中有一个例子:

"Seconds/day: #{24*60*60}" # => Seconds/day: 86400
"#{'Ho! '*3}Merry Christmas!" # => Ho! Ho! Ho! Merry Christmas!
"This is line #$." # => This is line 3

但是当我尝试在一个单独的文件中实现第三行的符号#$时,它会打印出很奇怪的东西。这是我的文件str2.rb

puts "Hello, World #$."
puts "Hello, World #$"
puts "#$"

现在我运行它(在Win XP控制台中):

C:\ruby\sbox>ruby str2.rb
Hello, World 0
Hello, World ["enumerator.so", "C:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/i386-mingw32/enc/encdb.so", "C:/Rai
lsInstaller/Ruby1.9.3/lib/ruby/1.9.1/i386-mingw32/enc/windows_1251.so", "C:/RailsInstaller/Ruby1.9.3/lib/ruby/
1.9.1/i386-mingw32/enc/trans/transdb.so", "C:/RailsInstaller/Ruby1.9.3/lib/ruby/site_ruby/1.9.1/rubygems/defau
lts.rb", "C:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/i386-mingw32/rbconfig.rb", "C:/RailsInstaller/Ruby1.9.3/l
ib/ruby/site_ruby/1.9.1/rubygems/deprecate.rb", "C:/RailsInstaller/Ruby1.9.3/lib/ruby/site_ruby/1.9.1/rubygems
/exceptions.rb", "C:/RailsInstaller/Ruby1.9.3/lib/ruby/site_ruby/1.9.1/rubygems/defaults/operating_system.rb",
 "C:/RailsInstaller/Ruby1.9.3/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb", "C:/RailsInstaller/Ruby1.9
.3/lib/ruby/site_ruby/1.9.1/rubygems.rb", "C:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/i386-mingw32/enc/utf_16l
e.so", "C:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/i386-mingw32/enc/trans/utf_16_32.so", "C:/RailsInstaller/Ru
by1.9.3/lib/ruby/1.9.1/i386-mingw32/enc/trans/single_byte.so"]
puts

我发现#$.(句号必填)仅在Interactive Ruby Console中显示行号。在文件中使用它在任何行上生成0。但是,如果我使用像"#$" \n "#$"这样的符号来打印所有文本的原因?

文件中也有这样的代码:

puts "Hello, World #$" ## without period at the end

产生了这样的错误:

C:\ruby\sbox>ruby str2.rb
str2.rb:3: unterminated string meets end of file

#$是什么意思?在哪里以及如何使用它?

2 个答案:

答案 0 :(得分:6)

"#$.""#{$.}"的简写,或全局变量的插值。类似地,实例变量& #@#@@表示类变量。

你所拥有的问题是"中的第二个"#$" 被解释为字符串的结束引用,而是作为全局变量的一部分要插入的名称($")。为了更清楚地说明你的代码是如何被解释的,我将使用字符串文字来代替Ruby认为的字符串分隔符:

puts %(Hello, World #$.)
puts %(Hello, World #$"
puts )#$"

正如您所看到的,这是打印的数组来源(它是$"的内容)以及最后的“puts”字符串。代码末尾的#$"被解释为注释。 (请注意,第二个字符串是跨越 - 并且包括第二行和第三行之间的换行符。)

如果您确实想要将#$打印为字符串,则必须将其中的一部分转义或使用单引号字符串:

  • "\#$" #=> "#$"
  • "#\$" #=> "#$"
  • '#$' #=> "#$"

简单地将#$放在插入的字符串中而不进行转义是无效的,可以通过使用字符串文字看出:

%(#$)  #=> #<SyntaxError: (eval):2: syntax error, unexpected $undefined
       #   %(#$)
       #      ^>

答案 1 :(得分:0)

在Ruby中,使用美元符号定义全局变量。

$foo = "bar"

有一些预定义的全局变量,例如

# last line number seen by interpreter
$.

我认为你只是错过了这个时期。您可以使用 -

将变量插入到字符串中
"line #{$.}"

或简写

"line #$."