单例类和实例变量

时间:2016-05-06 10:04:25

标签: ruby eval irb

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

3 个答案:

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

您应该知道evalinstance eval

之间的区别

Kernel.eval计算当前上下文中的字符串或给定绑定的上下文。它是IRB用于处理输入的方法。它允许您为当前上下文定义新的变量和方法。

Object.instance_eval在某个类实例的上下文中计算字符串(或给定块),从而允许直接访问不具有attrattr_accessor的类属性。它允许您为实例定义新方法。

所以:

a.instance_eval { @var_one = 1 }
a.instance_variables
# => [:@var_one]