31

なぜこれが機能するのかわかりません。

module Base
  attr_reader :first
  def setup
    @first = 1
  end
end

module Addon
  attr_reader :second
  def setup
    #super
    @second = 2
  end
end

class Test
  include Base
  include Addon

  def initialize(num)
    @num = num
    setup
  end
end

a = Test.new(1)
p a.first
p a.second

基本的に、私はいくつかのものをセットアップする「ベース」モジュールを持っています。アドオンモジュールもあります。これは、クラスがそれを含めたい場合に、さらにいくつかのものをセットアップします。

今、私がそれをテストするとき、私がそのスーパーコールを持っていなければ、私は

nil
2

スーパーコールがあると

1
2

スーパーは実際にここで何をしますか?BaseとAddonが関連していない場合でも、Baseモジュールからsetupメソッドを呼び出しています。

モジュールのコンテキストでsuperを使用したのはこれが初めてです。以前は、クラスでスーパーコールを常に使用していて、同じメソッドを持つ親を見つけるために継承ツリーを上っていくだけだと思っていました。

複数のモジュールを含めると、ある種の継承ツリーも設定されますか?

編集:文脈上、アドオンモジュールはベースモジュールなしでは決して含まれず、ベースモジュールは常に追加のアドオンモジュールの前に含まれます。

4

1 に答える 1

42

はい、モジュールを含めると、それらは継承チェーンに注入されます

Test.ancestors # => [Test, Addon, Base, Object, Kernel, BasicObject]

Addonモジュールが含まれている場合、既存のsetupメソッドをから再定義しBaseます。Baseのバージョンを呼び出す場合は、を使用しますsuper

于 2012-07-09T22:33:25.590 に答える