Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

String Concatenation Error

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?

like image 369
Mr. Llama Avatar asked May 02 '11 19:05

Mr. Llama


1 Answers

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.

like image 163
sepp2k Avatar answered Oct 27 '22 06:10

sepp2k