你应该使用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)