Just got bit by a little order of operations confusion.
irb(main):012:0> a = nil or 1
=> 1
irb(main):013:0> a
=> nil
irb(main):014:0> a = (nil or 1)
=> 1
irb(main):015:0> a
=> 1
Probably old news to long time rubyists but it surprised me. Is there any way to get a warning or something when a statement like the above may not be behaving like you would think?
I doubt this is the answer you're looking for, but if you use || instead of or, the precedence is different. i.e. a = nil || 1 does what you think it does.
Devin
Jack Christensen wrote:
···
Just got bit by a little order of operations confusion.
irb(main):012:0> a = nil or 1
=> 1
irb(main):013:0> a
=> nil
irb(main):014:0> a = (nil or 1)
=> 1
irb(main):015:0> a
=> 1
Probably old news to long time rubyists but it surprised me. Is there any way to get a warning or something when a statement like the above may not be behaving like you would think?
Just got bit by a little order of operations confusion.
irb(main):012:0> a = nil or 1
=> 1
irb(main):013:0> a
=> nil
irb(main):014:0> a = (nil or 1)
=> 1
irb(main):015:0> a
=> 1
But note:
a = nil || 1
=> 1
a
=> 1
Probably old news to long time rubyists but it surprised me. Is there
any way to get a warning or something when a statement like the above
may not be behaving like you would think?
No, because Ruby cannot know what you expect. But note that there *are*
warnings:
if ( a = 10 )
"ja"
end
(irb):3: warning: found = in conditional, should be ==
=> "ja"
"or" and "and" have much lower precedence than "||" and "&&" to give you
the choice and for example do things like
arr.empty? and puts "it's empty!"
a > 0 and puts "positive"
Just got bit by a little order of operations confusion.
irb(main):012:0> a = nil or 1
=> 1
irb(main):013:0> a
=> nil
irb(main):014:0> a = (nil or 1)
=> 1
irb(main):015:0> a
=> 1
Probably old news to long time rubyists but it surprised me. Is there
any way to get a warning or something when a statement like the above
may not be behaving like you would think?
Jack
Not that I know of, but note that "||" is like "or" with different
precedence:
irb(main):001:0> a = nil || 1
=> 1
irb(main):002:0> a
=> 1