Is there any wisdom behind “and”, “or” operators in Ruby?

前端 未结 5 1064
小蘑菇
小蘑菇 2020-11-29 11:21

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

相关标签:
5条回答
  • 2020-11-29 11:48

    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.

    0 讨论(0)
  • 2020-11-29 11:57

    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.

    0 讨论(0)
  • 2020-11-29 11:57

    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.

    0 讨论(0)
  • 2020-11-29 11:57

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

    0 讨论(0)
  • 2020-11-29 12:11

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

    0 讨论(0)
提交回复
热议问题