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回调逻辑的模块,然后扩展其他几个模块,我希望它们使用included扩展模块中的回调(但如果,例如,Barextends Foo,如果可能的话,我想在闭包中self引用)。Barincluded

可能这有点令人困惑。

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

问题是我需要定义included而不是self.included让 Barincluded作为类方法。以下是我想要的:

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 回答