1

||or、 または&&との違いはand理解できますが、理解できないのは次のとおりです。

の値を返すメソッド、またはfalse の@var場合は nil の場合は初期化するメソッドを考えてみましょう。@var

私は JavaScript のバックグラウンドから来たので、次のように記述し||ます=

def some_method
  @var || (@var = MyClass.new)
end

優先順位が低いためor、またはを使用します。or

def some_method
  @var or @var = MyClass.new
end

またはより簡潔に:

def some_method
  @var ||= MyClass.new
end

しかし、たまたまこのバージョンも機能しました:

def some_method
  @var || @var = MyClass.new
end

Web を検索しましたが、有用な結果が見つかりませんでした。

それらのほとんどは、 と の違いを伝えるだけ||ですor

||演算子の優先順位表には、 の優先順位が よりも高いことが明確に示されてい=ます。

私もできるしa = b || c = d、Ruby はそれをa = (b || (c = d)).

この動作はどこかに文書化されていますか、それとも Ruby の魔法のようなものですか?

PS CoffeeScript も同じ動作をします。

更新/明確化: この質問は短絡評価に関するものではありません。しかし、演算子の優先順位について。もう一度言い換えさせてください:

||の優先順位が よりも高い場合=、なぜ ruby​​ はa || a = bを認識しa || (a = b)(a || a) = b構文エラーを発生させるのですか?

4

3 に答える 3

3

Ruby では、short-circuit evaluationこのような論理式を評価するために呼び出されたものを使用します。2 番目の引数は、最初の引数が式を評価するのに不十分な場合にのみ考慮されます。

あなたの例では、@varis initialnilであるため、式の後半が評価され、 のインスタンスに設定されますMyClass.new

その表現の展開がなかなか面白い。ここここにいくつかのブログ投稿があり、それを非常にうまくカバーしています。

于 2013-02-03T17:15:02.337 に答える
2

優先順位が問題になるのは、式にあいまいさがある場合のみです。の場合には:

 @var || @var = MyClass.new

あいまいさはありません。代入演算子=は、その左側に単一の変数がある場合にのみ意味があります (複数の代入から生じる複雑さは無視してください)。" " という変数に何かを代入しても意味がありません@var || @var。したがって、あいまいさはありません。上記の式を解釈する唯一の方法は、次のように解釈することです。

 @var || (@var = MyClass.new)

したがって、優先順位はここでは問題になりません。

于 2013-02-03T17:32:10.090 に答える
0

私は完全に忘れてしまいandますor。必要に応じて括弧を付けて &&andを使用してください。||

最後の例は、インスタンス変数を使用しているためにのみ機能します。ここで違いを考えてみましょう:

1.9.3> newvar
NameError: undefined local variable or method `newvar' for main:Object
        from (irb):59
        from /home/don/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `<main>'
1.9.3> @newvar
 => nil

しようnewvar || newvar = 3とすると、エラーが発生します。

この SO の質問を見たいと思うかもしれません: Ruby で ||= (or-equals) とはどういう意味ですか? .

于 2013-02-03T17:20:39.173 に答える