字符串连接错误
我遇到了语法错误。 我接受这是一个语法错误,但我有点好奇为什么它是一个语法错误。
这完全符合您的预期:
(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 +5
或puts -x
也必须被解析为puts() + 5
并且puts() - x
而不是puts(+5)
和puts(-x)
– 在这个例子中,很明显后者是预期的。