1

私がやりたいことは、大まかに次のとおりです。

module Foo

  def self.included base
    base.extend ClassMethods
  end

end

module Bar
  extend Foo

  module ClassMethods
    def hi
      return "hello!"
    end
  end
end

class Baz
  include Bar
end

Baz.hi #=> "hello!'

しかし、代わりに私は得る

NoMethodError: undefined method `hi' for Baz:Class

明確でない場合、より一般的に私がしようとしているのは、includedコールバックのロジックを含む 1 つのモジュールを作成し、他のいくつかのモジュールを拡張してincluded、拡張モジュールからのコールバックを使用することです (ただし、たとえば、Barextends 、できればfor のクロージャで参照しFooたい)。selfBarincluded

おそらくそれは少し混乱しています。

4

2 に答える 2

1

あなたは決してinclude Fooどこにもいないので、includedフックは決して呼び出されません。extended次の理由から、フックを使用する必要がありますextend Foo

module Foo
  def self.extended(base)
    base.define_singleton_method(:included) do |base|
      base.extend base::ClassMethods
    end
  end
end

module Bar
  extend Foo

  module ClassMethods; def hi; 'hello!' end end
end

class Baz; include Bar end

Baz.hi #=> 'hello!'
于 2013-04-09T15:56:59.067 に答える
0

問題は、Bar をクラス メソッドとして取得するのincludedではなく、定義する必要があることでした。以下は私が望んでいたことを行います:self.includedincluded

module Foo

  def included base
    base.extend self::ClassMethods
  end

end

module Bar
  extend Foo

  module ClassMethods
    def hi
      return "hello!"
    end
  end
end

class Baz
  include Bar
end

Baz.hi #=> "hello!'
于 2013-04-09T16:53:17.163 に答える