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 :(得分: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}}