0

私が Ruby 演算子に使用しているリファレンスはhttp://phrogz.net/programmingruby/language.html#table_18.4です。このリファレンスや私が見た他のリファレンスによると、等価演算子は論理 AND (&&ではなく、Ruby の演算子よりも優先されます。 and)。

私は次のものを持っています:

foo = nil
foo < 5 # NoMethodError: undefined method `<' for nil:NilClass

確認するには、次のfooことを行います。

foo && (foo < 5) # Note the parenthesis

しかし、これは機能します:

foo && foo < 5 # why does this work?

演算子の優先順位のため、foo < 5最初に発生する必要があり、AND が評価される前にエラーが発生します。何か不足していますか?

4

5 に答える 5

1

以下は、問題を理解するのに少し役立ちました。

書き直せる

foo && foo < 5

なので

foo && foo.<(5)

これは今でははるかに理にかなっています。次のようなステートメントでも同じ動作が期待できます。

foo && foo.even?

foo最初に評価され、その後に評価されることを期待するでしょうfoo.even?foogets が前に評価されるとき、foo.<(5)またはあなたが書くことができるときに同じことがここにありますfoo < 5

&&今、私は と が優先順位表に従って実際に動作する例を考え出そうとしてい<ますが、それでも成功していません。

于 2013-08-19T15:52:40.833 に答える
0

&&||演算子を左から右に評価します。そして、ステートメントの真偽が判明するとすぐに評価が停止します。foo < 5評価されることはありません。これが、2 番目のアプローチが機能する理由です。

また、&&はるか||に高い優先順位があります。andそれらはおよび と同じではありませんor

于 2013-08-19T15:31:18.787 に答える
0

優先順位はバインドに関するものであり、必ずしも操作の順序ではありません。の LHS が&&false と評価された場合、RHS の評価はまったく行われません。

Ruby はある種の関数型であることを意図しているので、これをより詳細に示すためにいくつかの Haskell を紹介します。

true && x = x
false && x = false

左辺が false であるため、右辺の計算に進むことはなく、クラッシュします。これは非常に単純な遅延評価です。2 行目では、 の値xは無関係であるため、計算する必要がないため、わざわざ計算することはありません。これが遅延評価の美点です。:)

于 2013-08-19T15:31:58.487 に答える