我正在阅读 Module 文档,但似乎无法理解它们的区别以及应该在何处使用。
evalexec 有何不同?

最佳答案

我将通过在您的问题中包含 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 不同的方式会影响什么)31
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

所以 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/

10-16 02:05