19

次のコードがエラーをスローしないのはなぜですか?

if false
  x = 0
end

x  #=> nil

以下はエラーをスローしますが:

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

unless&caseステートメントでも同じことが起こります。

4

3 に答える 3

30

それは、Ruby パーサーの仕組みが原因です。変数はパーサーによって定義され、実際に実行されるかどうかに関係なく、コードを 1 行ずつ処理します。

パーサーがを参照すると、以降は現在のスコープでx =ローカル変数x( value を使用) を定義します。/ / / /は新しいスコープを作成しないためnil、コード ブロックの外で定義され、使用可能になります。また、条件が false であるため、内側のブロックは評価されないため、 に割り当てられません (したがって、 です)。ifunlesscaseforwhilexxnil

同様の例を次に示します。

defined?(x) and x = 0
x  #=> nil

これは何が起こるかのかなり高レベルの概要であり、必ずしもパーサーがどのように機能するかというわけではないことに注意してください。

于 2012-09-27T06:08:19.113 に答える
1

あなたの質問は興味深いと思ったので、調べてみたところ、次のことがわかりました: I don't understand ruby​​ local scope

正解はヨルグだそうです。

初期化されていない変数にアクセスしようとするとどうなるか見てみましょう。

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

例外は、変数またはメソッドのどちらであるかを評価できないことを示しています。同じ例外がスローされない理由は、初期化されていないローカル変数が nil に設定されているためです。puts xインタープリターはそれがx変数であるが初期化されておらず、メソッドではないことを認識しているため、問題ありません。

于 2012-09-27T06:15:14.840 に答える