0

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

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
4

3 回答 3

5

运算符 =优先于andand or(例如参见那里)。所以在你的第一个陈述中,

a = true

在其余部分之前进行评估。因此,您设置atrue.

于 2013-03-17T20:03:08.980 回答
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

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

于 2013-03-17T20:09:49.063 回答
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。在布尔值的情况下,将评估完整的表达式。

(b) 当一个表达式将有andor混合时,评估将持续到最后一个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
于 2013-03-17T20:02:44.480 回答