Difference between “and” and && in Ruby?

前端 未结 7 1209
别跟我提以往
别跟我提以往 2020-11-22 09:28

What is the difference between the && and and operators in Ruby?

相关标签:
7条回答
  • 2020-11-22 09:35

    The practical difference is binding strength, which can lead to peculiar behavior if you're not prepared for it:

    foo = :foo
    bar = nil
    
    a = foo and bar
    # => nil
    a
    # => :foo
    
    a = foo && bar
    # => nil
    a
    # => nil
    
    a = (foo and bar)
    # => nil
    a
    # => nil
    
    (a = foo) && bar
    # => nil
    a
    # => :foo
    

    The same thing works for || and or.

    0 讨论(0)
  • 2020-11-22 09:36

    and is the same as && but with lower precedence. They both use short-circuit evaluation.

    WARNING: and even has lower precedence than = so you'll usually want to avoid and. An example when and should be used can be found in the Rails Guide under "Avoiding Double Render Errors".

    0 讨论(0)
  • 2020-11-22 09:39

    and has lower precedence, mostly we use it as a control-flow modifier such as if:

    next if widget = widgets.pop
    

    becomes

    widget = widgets.pop and next
    

    For or:

    raise "Not ready!" unless ready_to_rock?
    

    becomes

    ready_to_rock? or raise "Not ready!"
    

    I prefer to use if but not and, because if is more intelligible, so I just ignore and and or.

    Refer to "Using “and” and “or” in Ruby" for more information.

    0 讨论(0)
  • 2020-11-22 09:43

    and has lower precedence than &&.

    But for an unassuming user, problems might occur if it is used along with other operators whose precedence are in between, for example, the assignment operator:

    def happy?() true; end
    def know_it?() true; end
    
    todo = happy? && know_it? ? "Clap your hands" : "Do Nothing"
    
    todo
    # => "Clap your hands"
    
    todo = happy? and know_it? ? "Clap your hands" : "Do Nothing"
    
    todo
    # => true
    
    0 讨论(0)
  • 2020-11-22 09:51

    I don't know if this is Ruby intention or if this is a bug but try this code below. This code was run on Ruby version 2.5.1 and was on a Linux system.

    puts 1 > -1 and 257 < 256
    # => false
    
    puts 1 > -1 && 257 < 256
    # => true
    
    0 讨论(0)
  • 2020-11-22 09:54

    The Ruby Style Guide says it better than I could:

    Use &&/|| for boolean expressions, and/or for control flow. (Rule of thumb: If you have to use outer parentheses, you are using the wrong operators.)

    # boolean expression
    if some_condition && some_other_condition
      do_something
    end
    
    # control flow
    document.saved? or document.save!
    
    0 讨论(0)
提交回复
热议问题