Ruby では、なぜ次のように書けるのでしょうか。
# b is not defined yet.
#
if b = true
a = b
end
# => a = true
しかし、ワンライナーではありません:
a = b if b = true
# => NameError: undefined local variable or method `b' for main:Object
Ruby では、なぜ次のように書けるのでしょうか。
# b is not defined yet.
#
if b = true
a = b
end
# => a = true
しかし、ワンライナーではありません:
a = b if b = true
# => NameError: undefined local variable or method `b' for main:Object
Ruby インタープリターは、割り当てを認識したときにローカル変数を「作成」するためです。
2 番目のケースでは、代入がまだ確認されていないため、式が解析されるときに変数は存在しません。
より正確に言うと、メソッドは最初に内部表現に解析され、その後おそらくコードが呼び出されて実際に実行されます。
変数は、その解析パスで「作成」されます。それは実際には宣言の問題であり、通訳者がそれらを認識するようになることを意味します。周囲のメソッドが誰かによって呼び出されるまで、スペースや値が与えられたという意味では作成されません。