字符串连接错误

我遇到了语法错误。 我接受这是一个语法错误,但我有点好奇为什么它是一个语法错误。

这完全符合您的预期:

(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 '+@' for "^2 = ":String 

奇怪的是,我可以在任何地方移动第二个加号,Ruby似乎没有任何问题,但如果第一个碰巧触及双引号,我会收到语法错误。

为什么会发生这种情况呢?

n.to_s +"^2 = "被解析为n.to_s(+"^2 = ") ,这在语法上是有效的,意味着“对字符串执行一元加操作^2 =然后将结果作为参数传递to to_s “。 但是,由于字符串没有一元加操作(由方法+@ ),因此会出现NoMethodError不是语法错误)。

它以这种方式解析而不是n.to_s() + "^2 = "是如果它以这种方式解析然后n.to_s() + "^2 = " puts +5puts -x也必须被解析为puts() + 5并且puts() - x而不是puts(+5)puts(-x) – 在这个例子中,很明显后者是预期的。