I ran into a syntax error. I accept that it's a syntax error, but I'm somewhat curious as to why it's a syntax error.
This works exactly as you'd expect it to:
(0..9).each { |n| puts n.to_s + "^2 = " + (n**2).to_s }
This throws an error:
(0..9).each { |n| puts n.to_s +"^2 = "+ (n**2).to_s }
The error:
NoMethodError: undefined method '+@' for "^2 = ":String
Oddly, I can move the second plus sign wherever and Ruby seems to have no problem with it, but if that first one happens to touch the double quote, I get a syntax error.
Why exactly does this happen?
n.to_s +"^2 = "
is parsed as n.to_s(+"^2 = ")
, which is syntactically valid and means "perform the unary plus operations on the string ^2 =
and then pass the result as an argument to to_s
". However since strings don't have a unary plus operation (represented by the method +@
), you get a NoMethodError
(not a syntax error).
The reason that it's parsed this way and not as n.to_s() + "^2 = "
is that if it were parsed this way then puts +5
or puts -x
would also have to be parsed as puts() + 5
and puts() - x
rather than puts(+5)
and puts(-x)
- and in that example it's rather clear that the latter is what was intended.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With