"和"和,,在Ruby中?

Ruby中&&and操作符的区别是什么?

193695 次浏览

and&&相同,但包含低优先级。它们都使用短路的评估

警告:and的优先级甚至低于=,所以你通常要避免使用and。应该使用and的例子可以在“避免双重渲染错误”下的Rails指南中找到。

实际的区别是结合强度,如果你没有准备好,这可能会导致奇怪的行为:

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

同样的事情适用于||or

Ruby风格指南比我说得更好:

使用&&/||用于布尔表达式和/或控制流。(规则 拇指:如果你必须使用外括号,你就用错了 运营商。)< / p >

# boolean expression
if some_condition && some_other_condition
do_something
end


# control flow
document.saved? or document.save!

||&&绑定了编程语言中布尔运算符的优先级(&&非常强,||略弱)。

andor优先级较低。

例如,与||不同,or的优先级比=低:

> a = false || true
=> true
> a
=> true
> a = false or true
=> true
> a
=> false

同样,与&&不同,and的优先级也比=低:

> a = true && false
=> false
> a
=> false
> a = true and false
=> false
> a
=> true

更重要的是,与&&||不同,andor具有相同的优先级:

> !puts(1) || !puts(2) && !puts(3)
1
=> true
> !puts(1) or !puts(2) and !puts(3)
1
3
=> true
> !puts(1) or (!puts(2) and !puts(3))
1
=> true

弱绑定andor可能对控制流有用:参见http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/

and的优先级比&&低。

但对于一个不太谦虚的用户来说,如果它与其他优先级介于两者之间的操作符一起使用,例如赋值操作符,则可能会出现问题:

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

and优先级较低,通常我们将其用作控制流修饰符,例如if:

next if widget = widgets.pop

就变成了

widget = widgets.pop and next

or:

raise "Not ready!" unless ready_to_rock?

就变成了

ready_to_rock? or raise "Not ready!"

我更喜欢使用if而不是and,因为if更容易理解,所以我忽略了andor

更多信息请参考“在Ruby中使用and和or”。

我不知道这是Ruby的意图还是一个bug,但是试试下面的代码。这段代码在Ruby 2.5.1版本和Linux系统上运行。

puts 1 > -1 and 257 < 256
# => false


puts 1 > -1 && 257 < 256
# => true

而且只检查第一个条件并给出结果 另一方面,,强检查两个条件并给出逻辑结果