10

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

Marc-André Lafortune
  • 75,965
  • 16
  • 156
  • 164
sarunw
  • 7,778
  • 10
  • 45
  • 82

5 Answers5

15

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 where you could use or but not ||:

value = possibly_false or raise "foo"

If you used ||, it would be a syntax error.

the Tin Man
  • 155,156
  • 41
  • 207
  • 295
JRL
  • 74,629
  • 18
  • 94
  • 144
8

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.

the Tin Man
  • 155,156
  • 41
  • 207
  • 295
Andrius
  • 2,748
  • 3
  • 17
  • 13
5

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

the Tin Man
  • 155,156
  • 41
  • 207
  • 295
Chuck
  • 228,856
  • 29
  • 291
  • 386
4

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
  • 11,481
  • 2
  • 21
  • 19
  • hmm, that explains why ruby is so immature and at the same time so much bloated. Still hard to wrap my head around that.. – akostadinov Jun 03 '14 at 16:37
2

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
  • 139,415
  • 24
  • 238
  • 326