2011-05-02 188 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