17

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?

4

5 に答える 5

17

これはとても良い質問です。これは、Rubyの変数のスコープと関係があります。

これについてのRubyバグトラッカーに関するMatzによる投稿は次のとおりです。

ローカル変数のスコープは、上から下、左から右に決定されます。したがって、if修飾子の条件で最初に割り当てられたローカル変数は、左側のif本体では有効ではありません。スペックです。

于 2012-06-13T20:39:44.977 に答える
2

理由はわかりませんが、インタプリタkが条件を評価する前に変数を検索しようとする問題です。

このように書くと、エラーは発生せず、期待どおりに機能します。

k = nil
h = {k: 1}
v = k if k = h.delete(:k)
于 2012-06-13T20:38:53.143 に答える
2

最初のバージョンでkは、ヒットするとすぐに、パーサーはまだ表示されていないため、吐き出します。

2番目のバージョンでkは、は代入式の一部であり、異なる方法で解析されます。

于 2012-06-13T20:37:59.553 に答える
0

Rubyインタープリターは、割り当てを確認するとローカル変数を作成するためです

2番目のケースでは、割り当てがまだ表示されていないため、式が解析されるときに変数は存在しません。

より正確には、メソッドは最初に内部表現に解析され、次に、おそらく、コードが最終的に呼び出され、実際に実行されます。

ローカル変数は、その解析パスで作成されます。それは宣言の問題であり、通訳者がそれらに気付くようになることを意味します。それらは、周囲のメソッドが誰かによって呼び出されるまで、スペースまたは値が与えられるという意味で作成されません。

于 2012-12-25T21:17:16.603 に答える
0

'='を1つだけ入れました

'=='で試してください

次に、エラーが発生します

2番目の例では、bに「true」を割り当てています。

于 2018-07-17T09:29:40.877 に答える