这是一次大型提交。但我希望你专注于这个改变块。 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
的方法。
我错过了什么。
答案 0 :(得分:5)
如果您dig in the documentation,您发现包含模块只会在尚未定义的情况下添加其中的方法。所以这种方法不会覆盖该方法,以防它已经存在。
答案 1 :(得分:0)
这个ActiveRecord代码已被问到另一个问题,它收到了一个很好的答案。 https://stackoverflow.com/a/3473479/420947
但是,这里简化的eval字符串消除了编写此代码的动机,这就是为什么它看起来令人困惑。在未更改的代码中,块绑定捕获用于反映关联的局部变量:#{reflection.name}.clear
。