我得到的确切错误是definitionNameError: undefined local variable or method 'a' for A:Class from (irb):2:in 'send' from (irb):2 from :0
说,我有一个班级定义,
class A; a = 1; end
如何在A之外获得'a'的值?
我试过了:
eval 'p a', A.send(:binding)
失败了,说道:
NameError: undefined local variable or method `a' for A:Class
from (irb):2:in `send'
from (irb):2
from :0
答案 0 :(得分:1)
一个块(闭包)自动捕获并携带来自创建它的代码位置的绑定(created => block也是一个对象):
因此可以使用Lambda访问类的局部变量,Lambda在创建局部变量时保留当前变量的当前状态。所以我们走了,
class A
a = 100
# creating lambda at class level as 'a' is a local variable of class A
@l = lambda { a }
class << self
attr_reader :l
end
end
puts A.l.call # => 1
答案 1 :(得分:0)
我不这么认为(不求助于源检查)。绑定最终与某些词法范围有关:除非存储,否则如何从另一个范围访问它?当然,下面的例子作弊。
b = class A
x = 20
binding
end
eval "p x", b
这也可能是特定于实现的(例如1.8.7但不是1.9)。我已经尝试了所有我能想到但仍然没有爱的绑定和/或local_variables的组合。当然,我可能只是做错了。很高兴看到解决方案。
答案 2 :(得分:0)
有了这个精确的定义,有一种方法:
secret_val = class A; a = 1; end
puts a
否则,一旦类定义上下文消失,该局部变量就会消失。
等待。在您在评论中链接的原始测验问题中,这些是实例变量,而不是本地变量。那是蛋糕。只需在类和实例上使用instance_variable_get("@a")
。