我在Pry玩,遇到了这个:
20] pry(main)> ('X' && 'O') == 'X'
=> false
[22] pry(main)> ('O' && 'X') == 'X'
=> true
有了这个,我试图检查括号内的两个值是否与右边的值相同。 第二个结果告诉我,我错过了一些东西。
似乎它正在返回最后一次比较的值('X'=='X'),但我的印象是&&一发现第一个假就会停止吗?
我可以看到为什么顺序一般很重要,但我想通过将它们包装在()中它们会被检查为一个条件?
答案 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中,除nil
和false
外,所有对象都具有 truthy 值。
在使用&&
时,它将继续评估所有表达式,直到获得一个评估为 falsy 的表达式。
答案 1 :(得分:1)
在ruby &&
,and
它会检查第一个值,如果它在那里,它会转到下一个值,第一个值false
或nil
它将返回价值。
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