我可以在Ruby中定义一个对其他作用域隐藏的类吗?



我想在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中进行评估,但这两种方法都不会隐藏其他环境中的类。有什么好办法吗?

您可以像这样使用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

事实证明,instance_eval将工作。但是,为了在实例中包装类,您需要提供字符串而不是块。看一看

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

接受字符串的实现将所有内容包装在匿名类中,但接受块的实现却没有这样做。

相关内容

最新更新