我正在阅读Module个文档,但似乎无法理解它们的区别,以及应该在哪里使用它们.

evalexec有什么不同?

推荐答案

我要回答比你的问题多一点的问题,在你的问题中加入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}_*个可用

Ruby相关问答推荐

Ruby:对于不存在的键,使用缺省值Hash在Hash中存储Hash

在 Ruby 中,如何从派生类中重写同一方法的不同方法调用基类方法?

当Ruby `Complex` 类除了`==` 之外没有任何关系运算符时,它的祖先怎么能有`Comparable`?

Rack并发 - rack.multithread、async.callback 或两者兼而有之?

如何通过 Rack 提供静态文件?

如何在Ruby中从字符串中go 除前导和尾随引号

Ruby 哈希文字的顺序是否得到保证?

您如何将 Cucumber 场景标记为待处理

Ruby 中的发送方法

按键对哈希进行分组并对值求和

读取文件时如何避免 UTF-8 BOM

获取Ruby中数组的差异

从字符串中删除所有特殊字符 - ruby

rails 控制台、RVM 和 readline 的问题

无法在 Windows 上安装 Aptana Studio 3.6

如何在不等式中使用Ruby case ... when?

Ruby 1.9 哈希,键中有破折号

如何在 gemspec 中指定最低 Ruby 版本?

如何在 Ruby 循环的第一次迭代中采取不同的行动?

查找与给定条件匹配的元素的索引