2011-05-02 86 views
8

我遇到了語法錯誤。我接受這是一個語法錯誤,但我有點好奇爲什麼這是一個語法錯誤。字符串串聯錯誤

這工作完全按照你期望它:

(0..9).each { |n| puts n.to_s + "^2 = " + (n**2).to_s } 

這將引發一個錯誤:

(0..9).each { |n| puts n.to_s +"^2 = "+ (n**2).to_s } 

錯誤:

NoMethodError: undefined method '[email protected]' for "^2 = ":String 

奇怪的是,我可以移動第二個符號和Ruby似乎沒有任何問題,但如果第一個碰巧碰到雙引號,我會得到一個語法錯誤。

爲什麼會發生這種情況?

+0

看起來好像當你做'.to_s +「'它認爲'+''是to_s的一個參數。嘗試做'.to_s()+「'並且它工作正常。不是一個答案,而是一個線索:) – 2011-05-02 19:54:32

回答

12

n.to_s +"^2 = "被解析爲n.to_s(+"^2 = "),這是語法上是有效的,表示「上的串^2 =執行一元加號的操作,然後再通過結果作爲參數傳遞給to_s」。但是由於字符串沒有一元加號操作(由方法[email protected]表示),因此會得到一個NoMethodError而不是語法錯誤)。

,它的解析這種方式,而不是作爲n.to_s() + "^2 = "是,如果它被解析這種方式然後puts +5puts -x會也被解析爲puts() + 5puts() - x而不是puts(+5)puts(-x)的原因 - 在這個例子它是相當清楚後者是預期的。

+2

很好地完成。我沒有想到,to_s將所有這些作爲參數。 – McStretch 2011-05-02 19:58:59