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)