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
#$
是什么意思?在哪里以及如何使用它?
答案 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 #$."