3

誰かが私が気づいているこの動作について私をチェックしてもらえますか?

ローカル変数に何も割り当てずに出力しようとすると、予想どおり例外が生成されます。到達不能なコード パスにローカル変数を割り当てると、機能します。これは事実ですか?

def a
  # Should generate an error because foobar is not defined.
  puts foobar
end

def b
  # This block never is run but foobar is entered into the symbol table.
  if false
    foobar = 123
  end

  # This succeeds in printing nil
  puts foobar
end

begin; a; rescue Exception => e; puts "ERROR: #{e.message}"; end
begin; b; rescue Exception => e; puts "ERROR: #{e.message}"; end
4

1 に答える 1

6

はい、これは正しいです。Ruby は、関数の実行時ではなく、解析時に変数のスコープを設定します。そのため、到達できないコード パスで変数が参照されている場合でも、変数を参照するだけで変数を定義できます。

私はしばらく前にこれに遭遇しました -振る舞いの記事については、このブログ投稿を参照してください。

于 2012-12-21T18:23:26.193 に答える