2

如何在 Ruby 中创建/提取变量/散列到当前绑定中?例如,以下结果为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)
4

1 回答 1

1

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

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.

于 2012-12-12T06:58:48.980 回答