2013-03-17 4 views
0

Почему старшинство ведет себя по-разному в следующем коде:рубин логического оператор старшинство, различные типов поведение

a = true or true and false 

if a then 
    puts "Foo" 
end 

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

This только печатает «Foo» и не «Quux».

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

E:\Home>ruby test.rb 
Foo 

ответ

5

Оператор = имеет приоритет над and и or (см., например, there). Поэтому в вашем первом отчете,

a = true 

оценивается перед остальными. Следовательно, вы установили a в true.

+0

Отличное объяснение, спасибо! – Adrien

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 

Резюме:

(а), когда вы будете использовать в выражении только and оператора значение выражения всегда последний операнд и обратное верно для выражения, имеющего только or operator.In Boolean будет вычисляться полное выражение.

(б) Если выражение будет иметь and и or смешанный, оценка будет продолжаться до последнего and и его ROH операнда будет значение выражения (в случае Boolean последнего and RHO, LHO будет оцениваться ., после этого результата будет производиться, как правило операции булевой

Применяя правило (б)

ниже код работает:

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 вычисляется по следующей схеме применения правила (б)

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

Еще одно хорошее применение правила (б)

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

if 2 or 3 and nil 
p "hello" 
end 
#nothing printed 
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 

Чтобы получить более естественное поведение, используйте && и ||.

Смежные вопросы