【问题标题】:Module.new with class_evalModule.new 与 class_eval
【发布时间】:2011-02-18 08:56:59
【问题描述】:

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

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

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

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

如果我取出Module.new 代码,如果我只留下class_eval 在这种情况下,我也会在self 中有一个名为foo 的方法。

我错过了什么。

【问题讨论】:

    标签: ruby-on-rails ruby metaprogramming


    【解决方案1】:

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

    【讨论】:

    • 看看这个馅饼pastie.org/956409。仅当尚未添加该模块时,类才会包含该模块。由于这是一个全新的匿名模块,它总是会被添加。另一个pastie.org/956410
    • 好吧,我还没有尝试过 - 我只是阅读了文档(并记得 The Humble Ruby Book 提到了类似的内容)。我想那里一定有另一个原因 - 或者没有,也许只是代码混乱?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-05-05
      • 2011-05-23
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 2011-03-01
      • 1970-01-01
      相关资源
      最近更新 更多