为什么优先级在以下代码中表现不同:
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
最后一个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
由于=
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