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

Ruby 如何使此代码设置实例变量的值?,ruby,class,dynamic,methods,instance-variables,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。如何使代码执行我想要的操作?在实例方法

我有以下代码,用于将普通变量转换为实例变量

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
。如何使代码执行我想要的操作?

实例
方法中,参数
ins
包含变量的名称,而不是其值。如前所述,没有办法从这一点上得到它的价值

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

def instance(var, bound)
    eval "@#{var}=#{var}", bound
end
foo = 3
instance('foo', binding)
@foo   # => 3
这将是这样工作的:

def instance(var, bound)
    eval "@#{var}=#{var}", bound
end
foo = 3
instance('foo', binding)
@foo   # => 3

代码示例定义了一个仅在该
类中可见的
foo
<代码>结束
块。即使你回到类X,它也消失了——它是词法范围的一部分,而不是类。这些“正常”变量在创建它们的范围之外永远不可见。一旦点击关闭其块的
,则只能通过该块中定义的代码访问它们。上面没有这样的代码。你想解决的实际问题是什么?你到底为什么想要这个复杂的代码?你的目标是什么?我很困惑,绑定是什么意思?一个绑定对象,它表示代码中某一点可见的变量集。当前绑定是通过
binding
方法返回的,因此上面的代码是文本的<代码>绑定是预先声明的,您不必做任何事情就可以让它工作。您可以将结果作为第二个参数传递给
eval
,这使得
eval
ed代码可以看到相同的变量集-这几乎是绑定对象所能做的所有事情。请参阅和。