2014-03-12 45 views
3

請注意以下事項:路線插值{}

"abcd#fg" # => "abcd#fg" 
"abcd#$fg" # => "abcd" characters #$ and after them are skipped 
"abcd#@fg" # => "abcd" characters #@ and after them are skipped 

這可能是字符串插值只是#,而不是#{}

$fg = 8 
"abcd#$fg" # => "abcd8" 
@fg = 6 
"abcd#@fg" # => "abcd6" 

它的工作原理類似於插值。它是一個錯誤還是一個功能?

+0

@ toro2k,謝謝,我沒有注意到這個問題 – Virtual

+0

當然,這是一個功能,這實際上是一個初學者的壞習慣很容易將別人的錯誤歸因於他們不瞭解的東西,我真的想知道爲什麼初學者傾向於認爲他們是正確的,而軟件是錯誤的。有經驗的程序員比較謙虛。 – sawa

+1

@sawa我不認爲這是一個不合理的問題。 –

回答

7

實際上,你可以插值全球,實例和類變量省略括號:

$world = 'world' 
puts "hello, #$world" 
# hello, world 

在您的例子都$fg@fg是未初始化的,因而評價爲nil,這就是爲什麼他們都intorpolated爲空字符串。當您編寫"abcd#fg"時,沒有插值,因爲#後面沒有跟着{,@,$之一。

您可以在RubySpec中找到記錄的功能(感謝@DavidMiani)。

如果你問我,不要依賴此行爲,並始終用括號內插變量,既爲可讀性和避免的問題,例如:

@variable = 'foo' 
puts "#@variable_bar" 

這將輸出一個空字符串代替,大概,期望的字符串"foo_bar「,因爲它試圖插入未定義的實例變量@variable_bar

+2

儘管它存在於[ruby spec字符串文件](https://github.com/rubyspec/rubyspec/blob/master/language/string_spec.rb)中,所以任何通過該規範的ruby都將使用該語法。 –

+0

@DavidMiani謝謝! – toro2k

+0

到RubySpec的鏈接已經失效。我只發現RubySpecs已關閉。 https://github.com/rubyspec/rubyspec/ – Mauddev