如何设置此代码设置实例变量的值?

时间:2012-05-05 02:26:09

标签: ruby class dynamic methods instance-variables

我有以下代码,意味着将正常变量转换为实例变量。

BasicObject.class_eval do
    def instance(ins)
        self.instance_variable_set("@#{ins}", ins)
    end
end

让我们说用户说

class X
  foo = 3
end
bar = X.new
bar.instance(:foo)

我想要它做的是将新创建的变量@foo设置为3,而是将@foo设置为:foo。如何使代码按照我的要求进行操作?

1 个答案:

答案 0 :(得分:1)

instance方法中,参数ins包含变量的名称,而不是其值。如上所述,从那时起就没有办法达到它的价值。

如果从源代码实际可见的代码中的某个点调用instance,这不在您的示例中(请参阅上面的注释),您也可以传递局部变量绑定,然后使用那。像这样:

def instance(var, bound)
    eval "@#{var}=#{var}", bound
end

哪个会这样:

foo = 3
instance('foo', binding)
@foo   # => 3