0
BasicObject.class_eval do
    def instance(ins)
        eval "@#{ins}=#{ins}", binding
    end
end

是有问题的代码。我想要它做的是在下面的代码中,在类 Foo 中创建一个新的实例变量 bar。运行此代码后得到的结果:

class Foo
  bar = 3
end
Foo.instance(:bar)

是:

 NameError: undefined local variable or method `bar for Foo:Class
        from /Users/Solomon/Desktop/Ruby/instance.rb:3:in `instance'
        from /Users/Solomon/Desktop/Ruby/instance.rb:3:in `eval'
        from /Users/Solomon/Desktop/Ruby/instance.rb:3:in `instance'

为什么会这样。

4

1 回答 1

0

这里有几件事......您已经instanceBasicObject. Foo然后,您在对象上调用此实例方法。Foo 对象是一个类。您尚未为 Foo 对象设置任何实例变量。@您使用符号设置实例变量。该instance方法所做的只是将实例变量@ins 设置为自身。

这里, binding也不需要binding返回当前变量绑定的顶级方法。binding如果您需要传递已保存的“环境”,则只需保存 a 。拥有, binding不会伤害任何东西,而是多余的。

 BasicObject.class_eval do
    def instance(ins)
       eval "@#{ins}= @#{ins}", binding      # @ after the '='
    end
 end



class Foo
  @bar = 3     # @ here
end
Foo.instance(:bar)
puts Foo.instance_variable_get("@bar")    # Shows the instance variable @bar for Foo object
于 2012-05-05T14:25:00.280 回答