如何在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)
答案 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
。