2012-05-05 159 views
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' 

这究竟是为什么。

+0

出于同样的原因在您的上一个问题中给出 - 一旦类声明已经处理,“bar”不存在。 –

回答

0

这里有些东西....您已经为BasicObject定义了一个实例方法instance。然后您在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 
相关问题