次のコードがエラーをスローしないのはなぜですか?
if false
x = 0
end
x #=> nil
以下はエラーをスローしますが:
y # NameError: undefined local variable or method `y' for main:Object
unless
&case
ステートメントでも同じことが起こります。
次のコードがエラーをスローしないのはなぜですか?
if false
x = 0
end
x #=> nil
以下はエラーをスローしますが:
y # NameError: undefined local variable or method `y' for main:Object
unless
&case
ステートメントでも同じことが起こります。
それは、Ruby パーサーの仕組みが原因です。変数はパーサーによって定義され、実際に実行されるかどうかに関係なく、コードを 1 行ずつ処理します。
パーサーがを参照すると、以降は現在のスコープでx =
ローカル変数x
( value を使用) を定義します。/ / / /は新しいスコープを作成しないためnil
、コード ブロックの外で定義され、使用可能になります。また、条件が false であるため、内側のブロックは評価されないため、 に割り当てられません (したがって、 です)。if
unless
case
for
while
x
x
nil
同様の例を次に示します。
defined?(x) and x = 0
x #=> nil
これは何が起こるかのかなり高レベルの概要であり、必ずしもパーサーがどのように機能するかというわけではないことに注意してください。
あなたの質問は興味深いと思ったので、調べてみたところ、次のことがわかりました: I don't understand ruby local scope
正解はヨルグだそうです。
初期化されていない変数にアクセスしようとするとどうなるか見てみましょう。
NameError: undefined local variable or method `UNDECLAREDVAR' for main:Object
例外は、変数またはメソッドのどちらであるかを評価できないことを示しています。同じ例外がスローされない理由は、初期化されていないローカル変数が nil に設定されているためです。puts x
インタープリターはそれがx
変数であるが初期化されておらず、メソッドではないことを認識しているため、問題ありません。