我想在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
接受字符串的实现将所有内容包装在匿名类中,但接受块的实现却没有这样做。