I wonder why ruby give and
, or
less precedence than &&
, ||
, and assign operator? Is there any reason?
views:
238answers:
5Being able to control the precedence of your operators is sometimes useful, especially if you are concerned with readability -- extra parenthesis in conditional statements can sometimes obscure the actual logic.
To be frank, though, I think the reason Ruby has the boolean operator precedence levels it does stems mostly from the fact that Matz was a Perl programmer before he ever wrote Ruby, and borrowed much of the core syntax and operators from that language.
They have very low precedence so that the operands don't have to be wrapped in parentheses (as is sometimes the case with && and ||).
I believe the idea is specifically to get them below the assignment operators, so you can write logic tests with assignments but without parens.
My guess is that's a direct carry-over from Perl. The operators 'or' and 'and' were added later in Perl 5 for specific situations were lower precedence was desired. For example, in Perl, here we wish that || had lower precedence, so that we could write :
try to perform big long hairy complicated action || die ;
and be sure that the || was not going to gobble up part of the action. Perl 5 introduced 'or', a new version of || that has low precedence, for exactly this purpose.
An example in Ruby were you could use 'or' but not '||':
value = possibly_false or raise "foo"
If you used ||, it would be a syntax error.
The difference is precedence. ||, && have higher precedence than =, but and, or have lower. So while you can do
a = nil || 0
you would have to do
a = (nil or 0)
to get same effect. If you do
a = nil or 0 The result of expression would still be 0, but a value would be nil.