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在 a 中使用和评估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 回答