私は簡単な質問があります:fooがnullまたはfalseの場合はRubyで評価
は、私が
def test
foo && a == b && c == "bar"
end
を記述する場合、それは式の残りの部分を評価し続けるのだろうか?私はこれを行う場合
それは何も変更しない多く
私は簡単な質問があります:fooがnullまたはfalseの場合はRubyで評価
は、私が
def test
foo && a == b && c == "bar"
end
を記述する場合、それは式の残りの部分を評価し続けるのだろうか?私はこれを行う場合
それは何も変更しない多く
代わり
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
に従って順序付けされ
答えに「いいえ」以上のものが必要だと思います。質問は '&&'のみに関係するので、なぜテーブルを提示するのですか? –
&&
は怠惰なオペラです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を返します。
なし、 '&&'とチェーンのすべてのステートメントが真である必要があります。 'foo'がnilまたはfalseの場合、残りの式は無視されます。 –
ブール式は常に左から右に評価されます。最初の条件がfalseで、&&を使用した場合、それ以上の評価は実行されません。 –
okですから、fooがnullまたはfalseの場合は両方のステートメントが同じですか?右 ? –