評価

2016-11-20 20 views
2

私は簡単な質問があります:fooがnullまたはfalseの場合はRubyで評価

は、私が

def test 
    foo && a == b && c == "bar" 
end 

を記述する場合、それは式の残りの部分を評価し続けるのだろうか?私はこれを行う場合

それは何も変更しない多く

+0

なし、 '&&'とチェーンのすべてのステートメントが真である必要があります。 'foo'がnilまたはfalseの場合、残りの式は無視されます。 –

+0

ブール式は常に左から右に評価されます。最初の条件がfalseで、&&を使用した場合、それ以上の評価は実行されません。 –

+0

okですから、fooがnullまたはfalseの場合は両方のステートメントが同じですか?右 ? –

答えて

1

代わり

def test 
    a == b && c == "bar" if foo 
end 

おかげで「fooがnullまたはfalseの場合、それは式の残りの部分を評価し続けるだろう?」 いいえ、それはしません

は、この表には、このような質問であなたを助ける必要があります。次の表は、優先順位が下降(上部に最高の優先順位)

N A M Operator(s)   Description 
- - - -----------   ----------- 
1 R Y ! ~ +     boolean NOT, bitwise complement, unary plus 
           (unary plus may be redefined from Ruby 1.9 with [email protected]) 

2 R Y **      exponentiation 
1 R Y -      unary minus (redefine with [email protected]) 

2 L Y */%     multiplication, division, modulo (remainder) 
2 L Y + -     addition (or concatenation), subtraction 

2 L Y << >>     bitwise shift-left (or append), bitwise shift-right 
2 L Y &      bitwise AND 

2 L Y |^     bitwise OR, bitwise XOR (exclusive OR) 
2 L Y < <= >= >    ordering 

2 N Y == === != =~ !~ <=> equality, pattern matching, comparison 
           (!= and !~ may not be redefined prior to Ruby 1.9) 

2 L N &&      boolean AND 
2 L N ||      boolean OR 

2 N N .. ...     range creation (inclusive and exclusive) 
           and boolean flip-flops 

3 R N ? :     ternary if-then-else (conditional) 
2 L N rescue     exception-handling modifier 

2 R N =      assignment 
2 R N **= *= /= %= += -=  assignment 
2 R N <<= >>=    assignment 
2 R N &&= &= ||= |= ^=  assignment 

1 N N defined?    test variable definition and type 
1 R N not     boolean NOT (low precedence) 
2 L N and or     boolean AND, boolean OR (low precedence) 
2 N N if unless while until conditional and loop modifiers 
に従って順序付けされ

+0

答えに「いいえ」以上のものが必要だと思います。質問は '&&'のみに関係するので、なぜテーブルを提示するのですか? –

4

理論

&&は怠惰なオペラですtor、ちょうど||のように。

それはaがfalseかnilであればa && bはとにかく偽/ nilになりますのでa && bで、Rubyはbをチェックする気にしないことを意味します。

この動作は、時間を節約し、NoMethodErrorsを回避できるので、実際には望ましいことです。 aがnilであれば

if a && method_which_requires_a_non_nil_parameter(a) 
    # ... 
end 

method_which_requires_a_non_nil_parameterはまったく呼び出されないでしょう。

か:

@x ||= long_method_to_calculate_x 

場合、式の残りの部分は評価されません回答

def test 
    foo && a == b && c == "bar" 
end 

x = x || long_method_to_calculate_x 

は、多くの場合、キャッシュに使用され、より頻繁に書き込まれますfooはnilまたはfalseです。 a、b、cはNameErrorを発生させずに未定義にすることもできます。

def test 
    a == b & c == "bar" if foo 
end 
  • fooがtruthyであれば、結果はまったく同じになります。

  • fooがnilまたはfalseの場合、最初の例と同様に、2つの等式は評価されません。しかし:

    • fooがnilの場合、両方のテストでnilが返されます。

    • fooがfalseの場合、最初の例はfalseを返し、2番目の例はnilを返します。