单例类和实例变量

mha*_*eeb 6 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]
Run Code Online (Sandbox Code Playgroud)

Ily*_*lya 8

你应该使用instance_eval:

a.instance_eval { @var_one = 1 }
=> 1
a.instance_variables
=> [:@var_one]
Run Code Online (Sandbox Code Playgroud)

当你使用普通时eval,你在当前的上下文中定义你的实例变量self,如果你在irb中这样做,它就是main对象:

a.eval { self }
=> main
Run Code Online (Sandbox Code Playgroud)

因此,您可以a.eval通过在实例的上下文中执行块来修改方法:

def a.eval(&block)
  instance_eval &block  
end

a.eval { @a = 1 }
=> 1
a.instance_variables
=> [:@a]
Run Code Online (Sandbox Code Playgroud)