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
||
。