为什么我在Ruby中看到两个表达式的不同结果,一个使用'&&',其他使用'和'运算符?

时间:2010-05-14 06:29:32

标签: ruby expression

  
    

print(-1 == -1)和(myobj.nil?)

  

  
    

print(-1 == -1)&& (myobj.nil?)

  

注意,myobj.nil?返回false 所以,这不应该是假的。

2 个答案:

答案 0 :(得分:3)

&&and具有不同的优先级。特别是,and具有非常低的优先级,低于几乎任何其他值。

print的返回值为nil,至少在Ruby 1.8中。因此,第一个表达式会像这样减少:

(print (-1 == -1)) and myobj.nil?
(print    true)    and myobj.nil? # => with the side-effect of printing "true"
      nil          and myobj.nil?
      nil

虽然第二个表达式会像这样减少:

print ((-1 == -1) && myobj.nil?)
print (   true    && myobj.nil?)
print                myobj.nil?
print                 false       # => with the side-effect of printing "false"
            nil

答案 1 :(得分:1)

因为它们具有不同的运算符优先级。

第一个评估为:

(print (-1 == -1)) and (myobj.nil?)

它打印为true,因为-1 == -1,然后print返回nil,nil and false为nil。

第二个相当于:

print ((-1 == -1) && (myobj.nil?))

打印(true&& false),这是假的,然后print返回nil。