2

クラスに含まれるときにクラスメソッドを追加するモジュールがあります。

最初のモジュールに含まれる別のモジュールを作成して、このモジュールに新しいメソッドを拡張させたいと思います。

次のコードは、私がやりたいことの例を示していますが、機能しません。最初のモジュールの「self.included」関数をオーバーライドして、私のメソッドでベースを拡張できると便利です。

これまでのところ、最初のモジュールのself.included関数をオーバーライドできましたが、superの呼び出しが機能しないため、最初のモジュールのクラスメソッドを失います。

module SomeModule

  def self.included(base)
    base.send(:extend, ClassMethods)
  end

  module ClassMethods

    # Some methods

  end

end


module MyNewModule

 def self.included(base)
    base.class_eval do
      def self.included(base)
        base.send(:extend, ClassMethods)
        super(base)
      end
    end
  end

  module ClassMethods

    def my_method
    end

  end

end

SomeModule.send(:include, MyNewModule)

class Pouet

  include SomeModule

  my_method # undefined local variable or method `my_method' for Pouet:Class (NameError)

end

これは可能ですか?

4

2 に答える 2

1

含まれているブロック内でinstance_evalを使用します。

instance_evalブロック内では、それを含めているオブジェクトにアクセスできるため、そこに追加のモジュールを含めることができるはずです。

編集:

ブロックは現在のコンテキストを格納するため、instance_evalに文字列を渡す必要があります。

私が同様のことを行った例については、https ://github.com/JoePym/UndergroundFootball/blob/master/app/models/player.rb#L14

于 2013-01-31T17:01:21.093 に答える
0

ついに自分でそれを機能させることができました。

これが良い習慣か悪い習慣か教えてください:

module SomeModule

  def self.included(base)
    base.send(:extend, ClassMethods)
  end

  module ClassMethods

    def my_original_method
    end

    # Some methods

  end

end


module MyNewModule

  def self.included(base)
    base.class_eval do

      class << self

        alias_method :old_included, :included

        def included(base)
          old_included(base)
          base.send(:extend, ClassMethods)
        end

      end

    end
  end

  module ClassMethods

    def my_method
    end

  end

end

SomeModule.send(:include, MyNewModule)

class Pouet

  include SomeModule

  my_original_method
  my_method

end
于 2013-01-31T17:26:20.043 に答える