如何在Ruby中创建/提取变量/ hash到当前绑定?

时间:2012-12-12 00:28:43

标签: ruby variables binding hash extract

如何在Ruby中创建/提取变量/ hash到当前绑定? 例如,以下结果为NameError

class Hash
  def extract(b)
    self.each do |key, value|
      bind = b.eval <<-END
        #{key} = nil
        proc { |value| #{key} = value }
      END
      bind.call(value)
    end
  end
end

hash = {:a => 1}
hash.extract(binding)
puts a

值得一提的是,对Kernel#binding的每次调用都会返回不同的内容 Binding对象实例,这让我觉得我并没有真正改变 Hash#extract调用者的绑定。例如,以下内容 工作原理:

class Hash
  def extract(b)
    self.each do |key, value|
      bind = b.eval <<-END
        #{key} = nil
        proc { |value| #{key} = value }
      END
      bind.call(value)
    end
  end
end

hash = {:a => 1}
b = binding
hash.extract(b)
eval('puts a', b)

1 个答案:

答案 0 :(得分:1)

我不确定在将当前绑定传递给方法(例如,下面的#export_to)之后,make 局部变量如何出现在调用者的执行上下文中。但是可以做类似的事情,从根本上达到同样的效果:

class Hash
  def export_to(o)
    each do |key, value|
      o.define_singleton_method(key) { value }
    end
  end
end

hash = {:a => 1}
hash.export_to self
puts a

请注意,self正在传递而不是binding

另请注意,此处的常见模式是设置实例变量而不是方法,在这种情况下,puts及更高版本的代码现在可以引用@a