Why doesn't this code work?
b if b = true
Error: undefined local variable or method `b'
But this does:
if b = true
b
end
Shouldn't they be the same?
Why doesn't this code work?
b if b = true
Error: undefined local variable or method `b'
But this does:
if b = true
b
end
Shouldn't they be the same?
これはとても良い質問です。これは、Rubyの変数のスコープと関係があります。
これについてのRubyバグトラッカーに関するMatzによる投稿は次のとおりです。
ローカル変数のスコープは、上から下、左から右に決定されます。したがって、if修飾子の条件で最初に割り当てられたローカル変数は、左側のif本体では有効ではありません。スペックです。
理由はわかりませんが、インタプリタk
が条件を評価する前に変数を検索しようとする問題です。
このように書くと、エラーは発生せず、期待どおりに機能します。
k = nil
h = {k: 1}
v = k if k = h.delete(:k)
最初のバージョンでk
は、ヒットするとすぐに、パーサーはまだ表示されていないため、吐き出します。
2番目のバージョンでk
は、は代入式の一部であり、異なる方法で解析されます。
Rubyインタープリターは、割り当てを確認するとローカル変数を作成するためです
2番目のケースでは、割り当てがまだ表示されていないため、式が解析されるときに変数は存在しません。
より正確には、メソッドは最初に内部表現に解析され、次に、おそらく、コードが最終的に呼び出され、実際に実行されます。
ローカル変数は、その解析パスで作成されます。それは宣言の問題であり、通訳者がそれらに気付くようになることを意味します。それらは、周囲のメソッドが誰かによって呼び出されるまで、スペースまたは値が与えられるという意味で作成されません。
'='を1つだけ入れました
'=='で試してください
次に、エラーが発生します
2番目の例では、bに「true」を割り当てています。