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

演算子 はand=よりも優先されます(たとえば、そこを参照してください)。したがって、最初のステートメントでは、andor

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

より自然な動作を得るには、とを使用&&||ます。

于 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、、の優先順位により、以下のコードが出力さ=れます。andor

a = true or true and falseは、ルール(b)を適用して次のように評価されます。

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

ルール(b)のもう1つの良い適用

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 に答える