Ruby中“ and”和&&之间的区别?


Answers:


348

and与相同,&&优先级较低。他们都使用短路评估

警告:and即使优先级也比更低,=因此您通常需要避免andand在Rails指南中的“ 避免双重渲染错误 ” 下可以找到应使用的示例。


50
指定一个通常应使用&&,而and仅应用于非常特殊的情况是一个好主意。
马克-安德烈·Lafortune

10
这里的另一个很好的解释是:devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby
安德鲁·马歇尔

17
来自安德鲁·马歇尔(Andrew Marshall)的链接:“另一种思考方式是将其and用作反向if语句修饰符:next if widget = widgets.pop变为widget = widgets.pop and next。这是一种很好的放置方式,确实使它在我的脑海中“点击”。(or就像反向unless修饰符一样。)
GMA

1
将此答案与tadman答案的详细信息结合起来,您将获得整体印象。
sargas 2014年

5
Avdi更新了关于何时使用以及vs. &&的观点。由于优先级较低,因此基本上将“和”和“或”用于控制流。 devblog.avdi.org/2014/08/26/...
EricC

238

实际的区别是绑定强度,如果您不准备这样做,它可能会导致特殊的行为:

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
a = foo and bar (a = foo ) && bar证明其and优先级低于&&
sargas

我不明白:“ foo and bar”是什么意思返回?
BKSpurgeon '16

a = foo and bar等价于(a = :foo) and nil。由于赋值返回逻辑上正确的值(:foo),因此第二部分求值,失败,返回nil
tadman '16

61

Ruby样式指南》说得比我更好:

使用&& / || 用于布尔表达式和/或用于控制流。(经验法则:如果必须使用外部括号,则说明使用了错误的运算符。)

# boolean expression
if some_condition && some_other_condition
  do_something
end

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

53
实际上,指南现在说要避免and/ or完全避免,他们可能有一点。通常,无论如何,它们在控制流中的用法显然可以由if/ unless运算符编写(例如document.save! unless document.saved?
Yarin 2013年

@akostadinov,以防万一您不拖拉:Ruby风格指南不是由Ruby的创建者编写的。Ruby是由Yukihiro Matsumoto和其他人创建的,而Ruby Style Guide 主要是由Bozhidar Batsov编写的。
安德鲁·格林

2
@AndrewGrimm,谢谢,很高兴知道。很抱歉拖钓,但我对红宝石现实的某些方面感到困惑。可以肯定的是-每个ruby项目都需要严格的样式策略以保持代码库的可维护性。
akostadinov

37

||&&与您期望的编程语言布尔运算符的优先级绑定(&&非常强,||略微弱一些)。

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 

而且,与&&和不同||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

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


2
“不像||or它的优先级低于=”。
Steph Sharp

18

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

1
谢谢,但是“和”的优先级与“ &&”有何不同?
BKSpurgeon '16

2
@BKSpurgeon有关Ruby中运算符优先级的有序列表,请参见此处
thutt

5

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中使用“和”和“或”


0

我不知道这是否是Ruby的意图,还是这是一个错误,请在下面尝试此代码。该代码在Ruby 2.5.1版上运行,并且在Linux系统上。

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

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

1
@JakubArnold Sarcasm从来没有帮助。有时是例子。
BobRodes

@BobRodes这不是讽刺。有7个答案,其中6个已经有示例。
雅各布·阿诺德

1
@JakubArnold我仍然发现此示例很有帮助。
BobRodes

我也得到奇怪的结果。v1 = true和false p v1#=> app.rb:true,IRB:false v2 = true && false p v2#=> app.rb:false,IRB:false puts 1> -1 && 257 <256#=> app.rb:false,IRB:false
Rich_F
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.