2016-03-31 22 views
0

これらの2行のコードの違いは何ですか?Ruby 2.2.4条件付きで代入を呼び出す

a = (b if (b = "test")) 
a = b if (b = "test") 

最初は正常に動作してtestabの両方を設定しますが、第二は、エラーがスローされます、

NameError: undefined local variable or method `b' for main:Object

私は2番目の行のために、Rubyは最初b = "test"を評価することを想定しているだろうif "test"、最後にa = bです。実際に何が起こっているのですか?

(Rubyバージョン2.2.4)

+1

ルビー2.3でこれらの作業はいずれも(それがあるべきと同じように)。 –

+0

Devonでは、両方の行について[命令シーケンス](http://ruby-doc.org/core-2.2.2/RubyVM/InstructionSequence.html)を調べて、違いを自分で見つけることができます。私は個人的には気にしません。なぜなら、このコードは決して使用されるべきではないし、とにかく最新のルビーでは再現されないからです。 –

+0

再生できません。 – sawa

答えて

2

両方の行は機能しません。そして両方のラインが機能します。それはシュレーディンガー式です:)。

あなたは新しい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 = bif 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番目のアプローチでは、すでに定義されているため、正しい結果が得られました。

ので、はこのように割り当てを行うことはありません

+0

ああ、replは答えかもしれない、はい。 :) –

+0

私はこの問題をテストしていたように見えますが、注文の偶然として、いつも一方通行とそれ以外の決済を行うという不幸なケースに遭遇しました。ありがとう! –

関連する問題