使用ActiveSupport :: Concern使ClassMethods也可用作模块功能

ken*_*enn 2 ruby ruby-on-rails activesupport

给出以下代码:

module Foo
  extend ActiveSupport::Concern

  module ClassMethods
    def foo
      puts 'foo'
    end
  end
end

class Bar
  include Foo
end
Run Code Online (Sandbox Code Playgroud)

我想做的是打电话Foo.foo而不是Bar.foo.有时在原始模块上调用类方法会更自然,特别是当功能与包含的类无关时,更好地与原始模块名称一起描述.

Pet*_*own 5

这看起来像代码味道.话虽如此,你可以让Foo模块使用类方法扩展自己:

module Foo
  extend ActiveSupport::Concern

  module ClassMethods
    def foo
      puts 'foo'
    end
  end

  extend ClassMethods
end

class Bar
  include Foo
end

Bar.foo
Foo.foo
Run Code Online (Sandbox Code Playgroud)