0

Rubyに、任意のコードを実行できる複数の環境が必要です。このコードは新しいクラスを定義する可能性があり、この新しいクラスをそれを定義した環境でのみ使用できるようにしたいです。

たとえば、私は次のようなことをしたいと思います。

class Environment
  def evaluate(&code)
    # Evaluate the code in this environment.
  end
end

e1 = Environment.new
e2 = Environment.new

e1.evaluate do
  class InnerClass
    # ...
  end

  puts InnerClass.nil? # false
end

e2.evaluate do
  puts InnerClass.nil? # true
end

の中で使用instance_evalして評価しようとしましたBindingが、どちらも他の環境からクラスを隠すことはありません。これを行うための良い方法はありますか?

4

2 に答える 2

1

instance_eval次のような動的クラス定義を使用できます。

e1.instance_eval do
  innerClass = Class.new do
    # ...
  end
  puts innerClass.nil? # false
end

e2.instance_eval do
   innerClass.nil? # NameError, innerClass not defined
end
于 2013-03-20T20:13:56.297 に答える
0

結局のところ、instance_eval動作します。ただし、インスタンス内でクラスをラップするには、ブロックではなく文字列を指定する必要があります。見てみな。

e1.instance_eval <<EOF
  class InnerClass
  end
  puts InnerClass.nil? # false
EOF

e2.instance_eval <<EOF
   InnerClass.nil? # NameError
EOF

文字列を受け取る実装はすべてを匿名クラスにラップしますが、ブロックを受け取る実装はラップしません。

于 2013-03-23T00:03:32.663 に答える