Module.new与class_eval

时间:2010-05-11 21:51:50

标签: ruby-on-rails ruby metaprogramming

这是一次大型提交。但我希望你专注于这个改变块。 http://github.com/rails/rails/commit/d916c62cfc7c59ab6411407a05b946d3dd7535e9#L2L1304

即使不了解代码的完整上下文,我也无法想到我将使用

的场景
include Module.new {
  class_eval <<-RUBY
    def foo
       puts 'foo'
    end
  RUBY
}

然后最终结果是在根上下文(自include Module.new之前的自我)中添加了一个名为foo的方法。

如果我取出Module.new代码,并且在这种情况下我只留下class_eval,我将在foo中使用名为self的方法。

我错过了什么。

2 个答案:

答案 0 :(得分:5)

如果您dig in the documentation,您发现包含模块只会在尚未定义的情况下添加其中的方法。所以这种方法不会覆盖该方法,以防它已经存在。

答案 1 :(得分:0)

这个ActiveRecord代码已被问到另一个问题,它收到了一个很好的答案。 https://stackoverflow.com/a/3473479/420947

但是,这里简化的eval字符串消除了编写此代码的动机,这就是为什么它看起来令人困惑。在未更改的代码中,块绑定捕获用于反映关联的局部变量:#{reflection.name}.clear