7

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(誤って)2回含まれるのでしょうか。

DoubleIncludedModuleもちろん、モジュールを1回だけ含めたいと思います。どうすれば(おそらくRuby on Railsメソッドを使用して)それを適切な方法にすることができますか?

4

1 に答える 1

10

例を挙げて答えます:

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は に 1 回だけ含まれていCます。厳密には に含まれていたため、2 回含まれていましたが、Bどちらにも含まれていましたC。これは問題ですか?おそらくそうではありません。各メソッドは祖先チェーンで 1 回しか発生せず、メソッドは同等の実装でオーバーライドされます (つまり、基本的に何もしません)。フックでエキゾチックなことをしていない限りincluded、何も気付かないでしょう。

于 2012-09-26T05:13:02.107 に答える