7

同じメソッド名のモジュールが2つあります。両方のモジュールをあるクラスに含めると、最後のモジュールのメソッドのみが実行されます。代わりに、クラスを初期化するときに両方を実行する必要があります。

class MyClass
    include FirstModule
    include SecondModule

    def initialize
        foo # foo is contained in both modules but only the one in SecondModules is executed
    end
end

それは実行可能ですか?

4

2 に答える 2

12

遠藤祐介が言うように、Ruby ですべてが可能です。この場合、単に 'foo' と言う便利さを忘れる必要があり、次のように、実際に何をしたいのかを明確にする必要があります。

class MyClass
  include FirstModule
  include SecondModule
  def initialize
    FirstModule.instance_method( :foo ).bind( self ).call
    SecondModule.instance_method( :foo ).bind( self ).call
  end
end

「FirstModule.instance_method...」という行は、単に「foo」と言うだけで置き換えることができますが、明示的に指定することで、何があっても、その mixin からメソッドを呼び出していることを確認できます。

于 2012-10-09T12:37:52.423 に答える
7

含まれているモジュールを変更できますか? おそらくsuper、2 番目のモジュールを呼び出すだけですか?

module M1
  def foo
    p :M1
  end
end

module M2
  def foo
    p :M2
    defined?(super) && super
  end
end

class SC
  include M1
  include M2

  def initialize
    foo
  end
end

SC.new

それとも、実際にこれをやりたいですか?

module M1
  def bar; p :M1 end
end

module M2
  include M1
  def foo; bar; p :M2 end
end

class SC
  include M2
  def initialize; foo end
end

ライブデモはこちら

于 2012-10-09T12:48:23.923 に答える