# Very weird behaviour of Ruby 1.8.6 with multi-line parenthes

**URL:** <https://www.ruby-forum.com/t/very-weird-behaviour-of-ruby-1-8-6-with-multi-line-parenthes/111405>\
**Category:** Ruby\
**Created:** [August 7, 2007, 12:26am UTC](https://www.ruby-forum.com/t/very-weird-behaviour-of-ruby-1-8-6-with-multi-line-parenthes/111405 "2007-08-07T00:26:30Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Nicolas\_L](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/71e660/32.png) [@Nicolas\_L](https://www.ruby-forum.com/u/Nicolas_L)\
**Post date:** [August 7, 2007, 12:26am UTC](https://www.ruby-forum.com/t/very-weird-behaviour-of-ruby-1-8-6-with-multi-line-parenthes/111405/1 "2007-08-07T00:26:30Z")

</div>

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 L.

---

<div class="post-metadata">

**Author:** ![Nicolas\_L](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/71e660/32.png) [@Nicolas\_L](https://www.ruby-forum.com/u/Nicolas_L)\
**Post date:** [August 7, 2007, 12:35am UTC](https://www.ruby-forum.com/t/very-weird-behaviour-of-ruby-1-8-6-with-multi-line-parenthes/111405/2 "2007-08-07T00:35:31Z")

</div>

On 8/6/07, Nicolas L. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> puts sum1
> 
> sum2 = (  
> 1
> 
> - 1
> - 1

- is a unary operator.

this parses as:

(  
1; +1; +1;  
)

If you want 3, do:

1 +  
1 +  
1

which parses as 1 + 1 + 1

---

<div class="post-metadata">

**Author:** ![Nicolas\_L](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/71e660/32.png) [@Nicolas\_L](https://www.ruby-forum.com/u/Nicolas_L)\
**Post date:** [August 7, 2007, 12:41am UTC](https://www.ruby-forum.com/t/very-weird-behaviour-of-ruby-1-8-6-with-multi-line-parenthes/111405/3 "2007-08-07T00:41:32Z")

</div>

Nicolas L. wrote:

> puts sum1  
> 3
> 
> irb(main):008:1\* 1
> 
> Regards,
> 
> Nicolas L.

+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

---

<div class="post-metadata">

**Author:** ![Nicolas\_L](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/71e660/32.png) [@Nicolas\_L](https://www.ruby-forum.com/u/Nicolas_L)\
**Post date:** [August 7, 2007, 12:50am UTC](https://www.ruby-forum.com/t/very-weird-behaviour-of-ruby-1-8-6-with-multi-line-parenthes/111405/4 "2007-08-07T00:50:33Z")

</div>

OK, now I get it, pluses need to go at the end of the line. Thanks  
Gregory and Tom !

Regards,  
Nicolas

---

<div class="post-metadata">

**Author:** ![Nicolas\_L](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/71e660/32.png) [@Nicolas\_L](https://www.ruby-forum.com/u/Nicolas_L)\
**Post date:** [August 7, 2007, 1:40am UTC](https://www.ruby-forum.com/t/very-weird-behaviour-of-ruby-1-8-6-with-multi-line-parenthes/111405/5 "2007-08-07T01:40:37Z")

</div>

Tom W. wrote:

> > 8\<-------------8\<-------------8\<-------------8\<-------------
> > 
> > C:\temp\>ruby bug.rb  
> > The same takes place in irb :  
> > irb(main):007:0\> op3 = (  
> > Duh ! This must mean something, but what ?  
> > 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).

Are there any interesting uses of

```
+ x

```

as a statement on its own, or is it likely that  
it’s a programmer error 99 times out 100? If the latter, perhaps it’s  
worth  
the ruby interpreter emitting a warning when it sees such constructs,  
much  
like the warning you get when you don’t use parantheses around argument  
lists  
in certain situations.

I’m happy to be told that there are valid uses of “+ x”. I’m still  
learning something  
new about ruby every day.

cheers,  
mick

---

<div class="post-metadata">

**Author:** ![Nicolas\_L](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/71e660/32.png) [@Nicolas\_L](https://www.ruby-forum.com/u/Nicolas_L)\
**Post date:** [August 7, 2007, 2:38am UTC](https://www.ruby-forum.com/t/very-weird-behaviour-of-ruby-1-8-6-with-multi-line-parenthes/111405/6 "2007-08-07T02:38:42Z")

</div>

Michael H. wrote:

> Are there any interesting uses of
> 
> - x
> 
> as a statement on its own, or is it likely that  
> it’s a programmer error 99 times out 100?

Not that I’m recommending it, but just as an idea:

module Enumerable  
def +@  
inject {|s,x| s+(+x)}  
end  
end

class Object  
def +x  
x  
end  
end

p +[1,2,3] # =\> 6

sum = +[1, [2, 3], [4.0]]

p sum # =\> 10.0

---

<div class="post-metadata">

**Author:** ![Nicolas\_L](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/71e660/32.png) [@Nicolas\_L](https://www.ruby-forum.com/u/Nicolas_L)\
**Post date:** [August 7, 2007, 1:57am UTC](https://www.ruby-forum.com/t/very-weird-behaviour-of-ruby-1-8-6-with-multi-line-parenthes/111405/7 "2007-08-07T01:57:40Z")

</div>

Michael H. wrote:

> like the warning you get when you don’t use parantheses around

I’ve seen it used in DSLs (domain specific languages) built with ruby.  
It can be defined on your own classes like so:

class Foo  
def initialize(x)  
@x = x  
end

def +@  
@x.reverse  
end  
end

+Foo.new(‘foo’)

# =\> “oof”

I don’t think I’ve ever used it in any of my code, but that doesn’t mean  
there aren’t legitimate uses for it. Anyone else used unary plus for  
something useful?

Tom

---

<div class="post-metadata">

**Author:** ![Nicolas\_L](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/71e660/32.png) [@Nicolas\_L](https://www.ruby-forum.com/u/Nicolas_L)\
**Post date:** [August 7, 2007, 10:03pm UTC](https://www.ruby-forum.com/t/very-weird-behaviour-of-ruby-1-8-6-with-multi-line-parenthes/111405/8 "2007-08-07T22:03:56Z")

</div>

2007/8/7, Michael H. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Are there any interesting uses of
> 
> ```
> + x
> 
> ```
> 
> as a statement on its own, or is it likely that  
> it’s a programmer error 99 times out 100?

I sometimes use +x side by side with -x. For example

UP = -1  
DOWN = +1

Regards,  
Pit
