Answers:
&&,而and仅应用于非常特殊的情况是一个好主意。
and用作反向if语句修饰符:next if widget = widgets.pop变为widget = widgets.pop and next。这是一种很好的放置方式,确实使它在我的脑海中“点击”。(or就像反向unless修饰符一样。)
实际的区别是绑定强度,如果您不准备这样做,它可能会导致特殊的行为:
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。
a = foo and bar 并 (a = foo ) && bar证明其and优先级低于&&。
a = foo and bar等价于(a = :foo) and nil。由于赋值返回逻辑上正确的值(:foo),因此第二部分求值,失败,返回nil。
《Ruby样式指南》说得比我更好:
使用&& / || 用于布尔表达式和/或用于控制流。(经验法则:如果必须使用外部括号,则说明使用了错误的运算符。)
# boolean expression
if some_condition && some_other_condition
do_something
end
# control flow
document.saved? or document.save!
and/ or完全避免,他们可能有一点。通常,无论如何,它们在控制流中的用法显然可以由if/ unless运算符编写(例如document.save! unless document.saved?)
||并&&与您期望的编程语言布尔运算符的优先级绑定(&&非常强,||略微弱一些)。
and并or具有较低的优先级。
例如,与相比||, 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
而且,与&&和不同||,and并且or具有相同的优先级绑定:
> !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
弱绑定and,or可能对控制流有用:请参阅http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/。
||,or它的优先级低于=”。
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它更易于理解,因此我只是忽略and和or。
有关更多信息,请参阅“在Ruby中使用“和”和“或”。
我不知道这是否是Ruby的意图,还是这是一个错误,请在下面尝试此代码。该代码在Ruby 2.5.1版上运行,并且在Linux系统上。
puts 1 > -1 and 257 < 256
# => false
puts 1 > -1 && 257 < 256
# => true
or||。