||最初の引数がtrueの場合でも演算子は2番目の引数を評価しますか?

私は式(a = 10)を評価しようとしています|| (rr = 20)で、rr変数は定義されていません

前の式を評価する前にルビーコンソールに rr と入力すると

rr
NameError: undefined local variable or method `rr' for main:Object
from (irb):1
from :0

When I write the expression (a=10) || (rr=20) it returns 10, and when I write rr afterwards it says nil

(a=10) || (rr=20)
rr  # => nil

だから、なぜこれが起こっているのですか? | rの2番目の引数が指定されている場合にのみ、rrを定義してはいけません。演算子は評価されますが、これは決してドキュメントに基づいてはなりませんか?

10
Rubyでは、ローカル変数がスコープ内にあることを知ることは難しいです。 a = 5の場合は a + 1 を実行してください。 aを5に設定してから6を返すと予想されるかもしれませんが、実際には a を設定し、 a
追加された 著者 David Grayson,
短絡条件付き演算(最初の条件がfalseの場合は2番目の条件を評価しない)と変数を宣言しないことには違いがあります。あなたの問題は2番目の問題に関係しています。
追加された 著者 DOK,

4 答え

これは、Rubyインタプリタが変数を代入すると(実際のコード行を実行する前に)、変数を定義するために発生します。この回答については、こちらをご覧ください。

Boolean OR( || )式は、 nil ではなく false でない場合、 || は右手式の値に評価されます。

あなたの例では、Rubyインタプリタは、 a rr (ただし、この行はまだ実行しません)、および a nil rr rr 次に、 || 式を実行します。この || 式では、 a 10 に割り当てられ、 10 が返されます。 rr は変更されません(まだ nil )。これは、次の行の rr nil である理由です。

11
追加された
変数は初期化されていません。 Rubyでは、初期化されていない変数が nil と評価されるため、 nil と評価されます。 が初期化されていれば、 nil ではなく 20 と評価されます。
追加された 著者 Jörg W Mittag,
正しい表現のために@JörgWMittag、tnx。私の答えの初期化は本当に定義する必要があります
追加された 著者 Aliaksei Kliuchnikau,

As @DOC said, && and || are known as short circuited conditional operators.

In case of ||, if the left part of || expression returns true, the right part won't be executed. That means the right part will be executed only if the left part of || expression returns false.

In case of &&, right part of the&&expression will be executed only if left part of && returns true.

与えられたシナリオ(a = 10)||ルビ表現 a = 10 true を返すため、rr = 20(rr = 20) Rubyの代入式では、 nilとfalse を除いて真を返すことに注意してください。

4
追加された

私は変数の定義は、実行時ではなく、解析段階で発生すると思います。だから、行を評価するとき、それは全部を解析し、変数は定義されていますが割り当てられていません。

3
追加された
まったく。これは正解です。変数はコードに代入があるときに定義されるため、変数は定義されています。しかし、割り当てが決して実行されないので、 初期化されたり割り当てられたりしません。したがって、これは初期化されていない変数がRubyで評価されるため、 nil と評価されます。
追加された 著者 Jörg W Mittag,

構文解析プログラムが変数を検出すると、パーサーはそれが定義されているコンテキスト内で自動的に有効です。 rr の評価は無効です。値の割り当てが決して発生しない場合でも、 rr = 20 を評価するだけで十分です。

これは、Rubyが変数とメソッド呼び出しをどのように区別しようとしているかの特質です。それは不完全ですが、通常はベストのために働きます。

2
追加された