为什么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这样的行为,它只返回那一刻已经分配的变量.
最佳答案
Kernel#local_variables
列出了当前作用域中的所有局部变量,包括那些可能尚未赋值的局部变量.
MRI解析每个作用域中的locals变量并在代码本身之前声明它们(例如下面的puts local_variables.inspect),因此即使在定义了这些变量之前调用local_variables时它们也会出现
但请注意定义?对于调用local_variables时尚未分配的变量,仍返回nil:
$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]