両方の行は機能しません。そして両方のラインが機能します。それはシュレーディンガー式です:)。
あなたは新しいREPLで二回それを実行することができます:
a = b if b = "test"
#=> NameError: undefined local variable or method `b' for main:Object
a = b if b = "test"
#=> "test"
新しいREPLを開く、のがより深く見てみましょう:
defined(b)
#=> nil
a = b if b = "test"
#=> NameError: undefined local variable or method `b' for main:Object
defined(b)
#=> local-variable
b
#=> "test"
a = b if b = "test"
#=> "test"
だから、実際にRubyはb = "test"
部分を評価され、現在では、この変数を定義しているが範囲。式a = b
とif b = "test"
が実行されました。それが最初に評価されたとき
c = p("assignment") && b if b = p("if") && "test"
#=> "if"
#=> "assignment"
#=> NameError: undefined local variable or method `b' for main:Object
しかしb
変数は代入文のスコープで定義されていませんでした。文は代入文の前に実行された場合、それよりももっと。 2番目のアプローチでは、すでに定義されているため、正しい結果が得られました。
ので、はこのように割り当てを行うことはありません
ルビー2.3でこれらの作業はいずれも(それがあるべきと同じように)。 –
Devonでは、両方の行について[命令シーケンス](http://ruby-doc.org/core-2.2.2/RubyVM/InstructionSequence.html)を調べて、違いを自分で見つけることができます。私は個人的には気にしません。なぜなら、このコードは決して使用されるべきではないし、とにかく最新のルビーでは再現されないからです。 –
再生できません。 – sawa