为什么优先级在以下代码中表现不同:
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
为什么优先级在以下代码中表现不同:
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
查看运算符优先级
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
要获得更自然的行为,请使用&&and ||。
看这里
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。在布尔值的情况下,将评估完整的表达式。
(b) 当一个表达式将有and和or混合时,评估将持续到最后一个and,其ROH操作数将是表达式的值(在Boolean最后一个andRHO 的情况下,将评估 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由于=over的优先级,下面的代码输出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