1

次のようなクラス階層があります。

class Tree
  def initialize(id, value)
    @id, @value = id, value
  end
end

class Entity < Tree

  include Mongoid::Document

  def initialize(id, value)
    # Do some stuff...
    super(id, value)
  end

end

ただし、メソッドsuper内で呼び出すと、親クラスのメソッドではなく、 にあるEntity#initializeメソッドが呼び出されます。initializeMongoid::DocumentTree

モジュールがインクルードされた後、Tree#initializeの本体からメソッドを呼び出すにはどうすればよいですか?Entity#initializeMongoid::Document

4

1 に答える 1

4

それがRubyの仕組みです。モジュールを含めると、Ruby は暗黙的に匿名クラスを作成し、メソッド ルックアップ キューの現在の上に配置します。

呼び出しもリストEntity.ancestorsに表示Mongoid::Documentされます。

私がお勧めできる素晴らしい本があります:Metaprogramming RubybyPaolo Perotta

また、これは同様のトピックに関するフォーラムスレッドで、スーパーのものを説明しています

アップデート:

モジュールコンストラクターの呼び出しを回避することが必要な場合、ここに可能なトリックがあります

class Entity < Tree

  def initialize(id, value)
    # Do some stuff...
    # initialize first
    super(id, value)
    # and after that - extend
    extend Mongoid::Document
  end

end

このメソッドは、モジュールで self.included を実行していません。モジュールのイニシャライザを実行せずにこの機能を維持する必要がある場合は、init で固有クラスを使用できます。

class Entity < Tree

  def initialize(id, value)
    # Do some stuff...
    # initialize first
    super(id, value)
    # and after that - include into eigenclass
    class << self
      include Mongoid::Document
    end
  end

end
于 2012-05-30T19:41:45.563 に答える