我试图了解在多个 Mixin 中使用时的 include 语句行为。也就是说,我有这些陈述:

class Article < ActiveRecord::Base
  include DoubleIncludedModule
  include AModule

  # ...
end

module AModule
  include DoubleIncludedModule

  # ...
end

module DoubleIncludedModule
  # ...
end
DoubleIncludedModule 类中包含多少次 Article?也就是说,由于 DoubleIncludedModule 的“后续”包含(首先在 Article 类中,然后在 AModule 类本身包含的 Article 中),将是 Ruby 自动处理的“双重包含”问题,或者 DoubleIncludedModule(错误地)包含两次?

当然,我只想包含一次 DoubleIncludedModule 模块。我怎样才能(也许通过使用一些 Ruby on Rails 方法)以正确的方式做到这一点?

最佳答案

我举个例子来回答:

module A
  def self.included base
    puts "A included in #{base}"
  end
end

module B
  include A

  def self.included base
    puts "B included in #{base}"
  end
end

class C
  include A
  include B
end

p C.ancestors
打印
A included in B
A included in C
B included in C
[C, B, A, Object, Kernel, BasicObject]
正如我们所见,A 只包含一次到 C 中。虽然从技术上讲它被包含两次,因为它被包含在 B 中,而 C 也被包含在 included 中。这有关系吗?可能不会。每个仍然只在祖先链中出现一次,并且任何方法都会被等效的实现覆盖——即,本质上是一个无操作。除非您正在使用 ojit_code 钩子(Hook)做一些奇特的事情,否则您不太可能注意到任何事情。

关于ruby-on-rails - 了解 `include` 混合模块的 "subsequent"语句行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12594760/

10-12 21:04