为什么优先级在以下代码中表现不同:
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
答案 0 :(得分:5)
答案 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)当表达式混合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
优先于=
,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