Ruby中的&&
和and
运算符之间有什么区别?
答案 0 :(得分:326)
and
与&&
相同,但与lower precedence相同。他们都使用short-circuit evaluation。
警告:and
的优先级甚至低于=
,因此您要避免始终and
答案 1 :(得分:236)
实际差异是绑定力量,如果你没有做好准备,可能会导致特殊的行为:
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
。
答案 2 :(得分:58)
Ruby Style Guide说得比我好:
使用&& / ||用于布尔表达式和/或用于控制流。 (规则) 拇指:如果你必须使用外括号,你使用的是错误的 运算符。)
# boolean expression
if some_condition && some_other_condition
do_something
end
# control flow
document.saved? or document.save!
答案 3 :(得分:36)
||
和&&
绑定您希望编程语言中的布尔运算符的优先级(&&
非常强,||
稍微强一点。)
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/。
答案 4 :(得分:17)
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
答案 5 :(得分:5)
和的优先级较低,我们主要将其用作控制流修饰符,例如 if
MyRegistry
变为
next if widget = widgets.pop
代表或
widget = widgets.pop and next
变为
raise "Not ready!" unless ready_to_rock?
我更喜欢使用 if 而不是和,因为如果更易理解,所以我只是忽略和和或。
参考
答案 6 :(得分:0)
我不知道这是不是Ruby的意图,或者这是一个bug,但请在下面尝试此代码。该代码在Ruby 2.5.1版上运行,并且在Linux系统上。
puts 1 > -1 and 257 < 256
# => false
puts 1 > -1 && 257 < 256
# => true