2013-03-02 63 views
2

有在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 

我發現#$.(期間是強制性)表示僅交互式Ruby的行號安慰。在文件中使用它會在任何行上生成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 

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

回答

6

"#$.""#{$.}"的簡寫或全局變量的插值。類似地,對於類變量,實例變量& #@@#@

與你有什麼問題是,在"#$"第二"解釋爲收盤報價爲字符串,而是作爲全局變量名的一部分進行插值($")。爲了使它更清楚如何你的代碼實際上是被解釋,我會代替什麼是Ruby認爲使用字符串文字字符串分隔符:

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

正如你可以看到,這是在打印陣列來自(它的內容是$")以及末尾的「puts」字符串。代碼末尾的#$"被解釋爲註釋。 (請注意,第二個字符串跨越幷包含第二行和第三行之間的換行符。)

如果您確實想要將#$作爲字符串打印,則必須轉義其中的一部分或使用單引號字符串:

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

簡單地把#$在沒有逃脫插值字符串是無效的,因爲可以通過使用字符串文字中可以看出:

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

這個怎麼樣'看跌期權 「#$結束」'和'看跌期權 「#{$}」'? – codeit 2013-03-02 15:58:17

+0

@codeit第一個沒有什麼特別的 - 它打印全局變量'$ end'的內容。第二個不是完整的表達。 – 2013-03-02 16:02:58

+0

那麼,這是否回答你的問題?不要忘記[upvote /接受你的問題的答案](http://meta.stackexchange.com/a/5235/158402)':)' – 2013-06-02 12:36:34

0

在Ruby中一個全局變量使用美元符號定義。

$foo = "bar" 

有一些預先定義的全局變量,如

# last line number seen by interpreter 
$. 

我認爲你只是缺少時期。您可以插入一個變量到使用字符串 -

"line #{$.}" 

或簡寫

"line #$." 
相關問題