“和”与&&和在Ruby?

时间:2009-09-15 12:16:44

标签: ruby operators

Ruby中的&&and运算符之间有什么区别?

7 个答案:

答案 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)

||&&绑定您希望编程语言中的布尔运算符的优先级(&&非常强,||稍微强一点。)

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/

答案 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 而不是,因为如果更易理解,所以我只是忽略

参考

  

Using “and” and “or” in Ruby

答案 6 :(得分:0)

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

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

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