奇怪的红宝石逻辑&&运算符结果

时间:2014-04-25 18:07:04

标签: ruby comparison logical-operators

我在Pry玩,遇到了这个:

20] pry(main)> ('X' && 'O') == 'X'
=> false
[22] pry(main)> ('O' && 'X') == 'X'
=> true

有了这个,我试图检查括号内的两个值是否与右边的值相同。 第二个结果告诉我,我错过了一些东西。

似乎它正在返回最后一次比较的值('X'=='X'),但我的印象是&&一发现第一个假就会停止吗?

我可以看到为什么顺序一般很重要,但我想通过将它们包装在()中它们会被检查为一个条件?

2 个答案:

答案 0 :(得分:5)

  

但我的印象是&&一发现第一个假就会停止吗?

你是对的。但这并没有发生在你的任何一个例子中。

在您的示例'O''X'中,都是字符串对象,其 truthy 值。

在示例('X' && 'O') == 'X'中,('X' && 'O')提供"O",并将其与"X"进行比较,后者为false当然。因此你得到了false

在另一个('O' && 'X') == 'X'中,('O' && 'X')提供"X",然后将其与"X"进行比较,当然它应该是true。因此,您在true中获得了PRY

注意:在Ruby中,除nilfalse外,所有对象都具有 truthy 值。

在使用&&时,它将继续评估所有表达式,直到获得一个评估为 falsy 的表达式。

答案 1 :(得分:1)

在ruby &&and它会检查第一个值,如果它在那里,它会转到下一个值,第一个值falsenil它将返回价值。

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
> a = true && false
=> false 
> a
=> false 
> a = true and false
=> false 
> a
=> true