ruby – 为什么local_variables返回尚未分配的局部变量?

为什么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]
点赞