为什么 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解析每个作用域中的局部变量并在代码本身(例如下面的 puts local_variables.inspect
)运行之前声明它们,因此即使在那些之前调用 local_variables
时它们也会出现变量已定义
但请注意,defined?
仍会为调用 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]
关于ruby - 为什么 local_variables 会返回尚未分配的局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15676360/