我正在阅读Module
个文档,但似乎无法理解它们的区别,以及应该在哪里使用它们.
eval
和exec
有什么不同?
我正在阅读Module
个文档,但似乎无法理解它们的区别,以及应该在哪里使用它们.
eval
和exec
有什么不同?
我要回答比你的问题多一点的问题,在你的问题中加入instance_{eval|exec}
个.
{instance|module|class}_{eval|exec}
的所有变化都会改变current context,即self
的值:
class Array
p self # prints "Array"
43.instance_eval{ p self } # prints "43"
end
现在来看看区别.eval
个版本接受字符串或块,而exec
个版本只接受块,但允许您向其传递参数:
def example(&block)
42.instance_exec("Hello", &block)
end
example{|mess| p mess, self } # Prints "Hello" then "42"
eval
版本不允许传递参数.它提供了self
作为第一个参数,尽管我想不出它的用途.
最后,module_{eval|exec}
与相应的class_{eval|exec}
相同,但它们与instance_{eval|exec}
略有不同,因为它们以不同的方式改变了当前打开的类(即def
将影响的类):
String.instance_eval{ def foo; end }
Integer.class_eval { def bar; end }
String.method_defined?(:foo) # => false
String.singleton_methods.include?(:foo) # => true
Integer.method_defined?(:bar) # => true
所以obj.instance_{eval|exec}
打开了obj
的单子类,而mod.{class|module}_{eval|exec}
打开了mod
本身.
当然,在任何Ruby对象(包括模块)上都有instance_{eval|exec}
个可用,而在Module
(以及Classes
)上只有{class|module}_*
个可用