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 に答える