访问类外部的局部变量时的definitionNameError

时间:2009-10-28 01:22:49

标签: ruby

我得到的确切错误是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

3 个答案:

答案 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")