Nicolas Lehuen wrote:
> Hi,
>
> I've just lost a few hours on this strange behaviour (bug ?).
> Apparently it is caused by some kind of operator precedence
> thingamagic. My original code was of course much more complicated, so
> finding the problem wasn't easy (I first thought my code was
> buggy...). Here is a piece of minimal code that reproduces the
> problem :
>
> 8<-------------8<-------------8<-------------8<-------------
>
> C:\temp>ver
>
> Microsoft Windows [version 6.0.6000]
>
> C:\temp>ruby -v
> ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
>
> C:\temp>type bug.rb
> sum1 = 1 + 1 + 1
>
> puts sum1
>
> sum2 = (
> 1
> + 1
> + 1
> )
>
> puts sum2
>
> C:\temp>ruby bug.rb
> 3
> 1
>
> 8<-------------8<-------------8<-------------8<-------------
>
> >From now on I promise I'll remember that you cannot safely use multi-
> line parenthesis expressions in Ruby ; I just would like to understand
> what this code means to Ruby, if it's not "give me the result of 1 + 1
> + 1".
>
> The same takes place in irb :
>
> C:\temp>irb
> irb(main):001:0> sum1 = 1 + 1 + 1
> => 3
> irb(main):002:0> sum2 = (
> irb(main):003:1* 1
> irb(main):004:1> + 1
> irb(main):005:1> + 1
> irb(main):006:1> )
> => 1
> irb(main):007:0> op3 = (
> irb(main):008:1* 1
> irb(main):009:1> * 3
> irb(main):010:1> * 9
> irb(main):011:1> )
> SyntaxError: compile error
> (irb):9: syntax error, unexpected '\n', expecting tCOLON2 or '[' or
> '.'
> from (irb):11
> from :0
>
> Duh ! This must mean something, but what ?
>
> Regards,
>
> Nicolas Lehuen
>
>
>
>
+1 is a valid ruby statement by itself. In order for the interpreter to
realize that your statement continues onto another line, you must end
the line with an operator that begs for more. In your case, moving the
pluses up to the previous lines will work:
irb(main):003:0> (1 +
irb(main):004:1* 1 +
irb(main):005:1* 1)
=> 3
You get that error in irb with multiplication because * 3 is not a valid
ruby statement by itself (remember that + 1 is valid, meaning simply, 1).
Hope this helps!
Tom
|