views:

238

answers:

5

I wonder why ruby give and, or less precedence than &&, || , and assign operator? Is there any reason?

+4  A: 

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

rcoder
+5  A: 

They have very low precedence so that the operands don't have to be wrapped in parentheses (as is sometimes the case with && and ||).

Chuck
+2  A: 

I believe the idea is specifically to get them below the assignment operators, so you can write logic tests with assignments but without parens.

DigitalRoss
+9  A: 

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.

JRL
Is there a name for the idiom of do_something or die? Does it get used in ruby?
Andrew Grimm
I don't know of any name for it, but it's fairly common in Ruby.
Chuck
Perl leans heavily on die, whereas Ruby uses raise. The advantage of an exception is you can rescue it.
tadman
@tadman: In Perl you can rescue a `die` if it happens within an `eval { };` block.
Lars Haugseth
Although technically you can rescue from a die, people don't usually bother unless it's really important. It's too much of a nuisance.
tadman
+2  A: 

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.

Andrius