tags:

views:

307

answers:

5

Am I fundamentally misunderstanding Ruby here? I've been writing Ruby code for about 2 years now and just today stumbled on this...

ruby-1.8.7-p249 > i = true and false
 => false 
ruby-1.8.7-p249 > i
 => true 

Could somebody explain what's going on here please? I'm sure it's to spec, but it just seems counter intuitive to me...

+13  A: 

and has lower precedence than = so i = true and false is parsed as (i = true) and false.

So the value true is assigned to i and then the return value of that operation (which is true) is anded with false, which causes the whole expression to evaluate to false, even though i still has the value true.

sepp2k
+16  A: 

The operators && and and have different precedence, and = happens to be in between.

irb(main):006:0> i = true and false
=> false
irb(main):007:0> i
=> true
irb(main):008:0> i = true && false
=> false
irb(main):009:0> i
=> false
irb(main):010:0> 

The first is read as (i = true) and false, the second as i = (true && false).

Thomas
alex
It's a strange quirk of the Ruby language. I encountered this caveat in a "Ruby for Python programmers" article yesterday, on my first day of learning Ruby :)
Thomas
i find it odd i've never encountered this problem before because I use this kind of statements all the time. I have to go back and review a ton of code now :(
alex
R. Bemrose
Ruby really is too much like Perl in places. There's probably a one-line Perl module so that you can `use Ruby;` and write the rest of your Perl script in Ruby syntax ;)
Thomas
thankyou thankyou thankyou
BenB
+3  A: 

Your line is parsed as

i = true and false
(i = true) and false
true and false

And of course because of i = true, i will be true afterwards.

Marcel J.
+3  A: 

As I understand your code, it is interpreted as :

  • Assign true to i
  • Return i and false

The results seems correct.

Thibault Falise
+1  A: 

As others have elucidated above, the keyword and is used when you want to put two different statements on one line. It is just a nicer way of making your code readable.

Thus,

 i = true and false 

implies

i = true; false #(a less widely used code layout in ruby)

or which is the most straightforward way:

  
 i = true
 false 

So, the output is correct. Otherwise, if you were expecting false, then use the boolean and &&.

Ceekays
thanks, that's good to know!
alex