我正在阅读 Module
文档,但似乎无法理解它们的区别以及应该在何处使用。eval
与 exec
有何不同?
最佳答案
我将通过在您的问题中包含 instance_{eval|exec}
来回答您的问题。{instance|module|class}_{eval|exec}
的所有变体都会更改当前上下文,即 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}
略有不同,因为它们改变了当前打开的类(即 0x231341 不同的方式会影响什么)31String.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
所以
def
打开 obj.instance_{eval|exec}
的单例类,而 obj
打开 mod.{class|module}_{eval|exec}
本身。当然,
mod
可用于任何 Ruby 对象(包括模块),而 instance_{eval|exec}
仅可用于 {class|module}_*
(因此 Module
)关于ruby - class_eval、class_exec、module_eval 和 module_exec 有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9057711/