0

我有以下代码,旨在将普通变量转换为实例变量。

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. 如何让代码做我想做的事?

4

1 回答 1

1

在您的instance方法中,参数ins包含变量的名称,而不是其值。正如所写的那样,从那时起没有办法获得它的价值。

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

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

这会像这样工作:

foo = 3
instance('foo', binding)
@foo   # => 3
于 2012-05-05T02:43:22.453 回答