为什么这会返回错误?

时间:2012-05-05 13:54:50

标签: ruby class methods eval instance

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'

为什么会这样。

1 个答案:

答案 0 :(得分:0)

在这里结合......你为instance定义了一个实例方法BasicObject。然后,您在Foo对象上调用此实例方法。 Foo对象是一个类。您尚未为Foo对象设置任何实例变量。您使用@符号设置实例变量。 instance方法所做的就是将实例变量@ins设置为自身。

此处不需要, binding,因为binding是返回当前变量绑定的顶级方法。如果您需要传递已保存的“环境”,则只需保存binding即可。 , 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 不会伤害任何东西,但是多余。

{{1}}