Ruby布尔运算符优先级,不同的行为

时间:2013-03-17 19:50:37

标签: ruby

为什么优先级在以下代码中表现不同:

a = true or true and false

if a then
  puts "Foo"
end

if true or true and false then
  puts "Quux"
end

这只打印“Foo”而不是“Quux”。

E:\Home>ruby --version
ruby 1.9.3p392 (2013-02-22) [i386-mingw32]

E:\Home>ruby test.rb
Foo

3 个答案:

答案 0 :(得分:5)

运营商=优先于andor(例如,请参阅there)。所以在你的第一个声明中,

a = true
在休息之前评估

。因此,您将a设置为true

答案 1 :(得分:2)

查看运算符优先级

http://www.techotopia.com/index.php/Ruby_Operator_Precedence

评估顺序是这样的

(((a = true) or true) and false)
# a = true

if (true or true) and false then
# equivalent to
if true and false then

要获得更自然的行为,请使用&&||

答案 2 :(得分:0)

见这里

2 and 7
#=> 7
2 or 7
#=> 2
2 or 7 and 12
#=> 12
2 or 7 or 12
#=> 2
2 or 7 and 12 or 10
#=> 12
true and true and false
#=> false
true or true or false
#=> true
true and true or false
#=> true
true or true and false
#=> false
true or true and false and true
#=> false

摘要:

(a)当你将在只有and表达式的表达式中使用时,表达式的运算符值始终是最后一个操作数,而对于只有or运算符的表达式,反之则为true。如果是布尔值将评估完整的表达。

(b)当表达式混合andor时,评估将一直持续到最后and及其 ROH 操作数将是表达式的值(在Boolean最后and RHO的情况下,将对LHO进行评估,之后该结果将作为布尔运算规则生成。

应用(b)

的规则

以下代码有效:

if true or true and false then
  puts "Quux"
end
#=> nil

a = true or true and false
#=> false

if a then
  puts "Foo"
 end
#Foo
#=> nil

由于Foo优先于=and,代码输出or

表达式a = true or true and false使用规则(b)评估如下

a = true or true and false
         ||
(a = true) or true and false
         ||
    true and false
         ||
       false

规则(b)的另一个好的应用

if 2 and 3 or nil
 p "hi"
end
#=> "hi"

if 2 or 3 and nil
 p "hello"
end
#nothing printed