为什么instance_variables
方法不会对变量@var_one
显示a
?
a = Object.new
def a.my_eval; yield end
a.my_eval { @var_one = 1 }
a.instance_variables
# => []
instance_variables
# => [@var_one]
答案 0 :(得分:9)
您应该使用heap
:
instance_eval
使用普通a.instance_eval { @var_one = 1 }
=> 1
a.instance_variables
=> [:@var_one]
时,在当前eval
的上下文中定义实例变量,如果在irb中执行,则为self
对象:
main
因此,您可以通过在实例的上下文中执行块来修改a.eval { self }
=> main
方法:
a.eval
答案 1 :(得分:2)
如果您的目标是以编程方式设置实例变量,则可以使用:
a.instance_variable_set(:@var_one, 1)
答案 2 :(得分:0)
您应该知道eval
和instance eval
:
Kernel.eval
计算当前上下文中的字符串或给定绑定的上下文。它是IRB用于处理输入的方法。它允许您为当前上下文定义新的变量和方法。
Object.instance_eval
在某个类实例的上下文中计算字符串(或给定块),从而允许直接访问不具有attr
或attr_accessor
的类属性。它允许您为实例定义新方法。
所以:
a.instance_eval { @var_one = 1 }
a.instance_variables
# => [:@var_one]