是真的&&是= = false?

时间:2013-06-14 13:39:58

标签: ruby operator-precedence

我错过了什么或者这是红宝石中的错误吗?

a = %w(foo bar baz)
a.include? "foo"                # => true
a.size == 3                     # => true
a.include? "foo" && a.size == 3 # => false 

3 个答案:

答案 0 :(得分:10)

a.include? "foo" && a.size == 3

评估为

a.include? ("foo" && a.size == 3)

因为

"foo" && a.size == 3  #=> true

这相当于

a.include? true

false

答案 1 :(得分:4)

  

true && true == false

没有

irb(main):003:0> true && true == false
=> false

答案 2 :(得分:3)

您打算检查的是

a.include?("foo") && a.size == 3

您的条件是检查"foo" && a.size == 3true,因为"foo"既不是nil也不是false)是否包含在数组中。

Zack评论的解决方案也是正确的,但看起来有点不寻常:

(a.include? "foo") && a.size == 3

在缺少括号的情况下将整个表达式视为方法的参数的一个原因是你可以这样做:

puts 3 + 4 * 5 - 6