4

local_variablesまだ割り当てられていない ( の呼び出し後に割り当てられた) ローカル変数を が返すのはなぜlocal_variablesですか?

a = 2
@aa = 1
# a = b # this will raise an error.
puts "local: #{ local_variables }"
puts "instance: #{ instance_variables }"

b = 2
@bb = 2
puts "local: #{ local_variables }"
puts "instance: #{ instance_variables }"

結果:

local: [:a, :b]
instance: [:@aa]
local: [:a, :b]
instance: [:@aa, :@bb]

私が期待するのは、instance_variablesその時点で既に割り当てられている変数のみを返す のような動作です。

4

2 に答える 2

1

Kernel#local_variablesまだ値が割り当てられていない可能性があるものを含め、現在のスコープ内にあるすべてのローカル変数を一覧表示します。MRIは各スコープ内のローカル変数を解析し、コード自体 (puts local_variables.inspect以下など) が実行される前にそれらを宣言するため、local_variablesこれらの変数が定義される前に が呼び出された場合でも表示されます。

ただし、が呼び出されたときに、まだ割り当てられていない変数をdefined?返すことに注意してください。nillocal_variables

$ cat /tmp/locals
#!/usr/bin/env ruby

a = 5
puts local_variables.inspect
puts defined?(a)
puts (defined?(b) || "[undefined]")
b = 10
puts defined?(b)

def foo
  c = 15
  puts local_variables.inspect
  d = 20
end
foo

$ ruby /tmp/locals
[:a, :b]
local-variable
[undefined]
local-variable
[:c, :d]
于 2013-03-28T08:42:27.367 に答える
1

Rubyはコンパイル時にローカル変数を作成します。インスタンス変数はインスタンスに明確にバインドされており、簡単にアクセスできます。ただし、次のb可能性があります。

  1. メソッド呼び出し
  2. self.b
  3. ローカル変数b

Brian Candler の回答はこちら (Google キャッシュ) でご覧ください。これが、実行時に eval でローカル変数を作成できない理由でもあります。

于 2013-03-28T09:14:55.960 に答える