[ROR] 如何在mixin模块中定义类方法(Howto define class methods in a mixin module)

方法一: 修改模块的include方法

module Bbq
  def self.included(base)
    base.send :include, InstanceMethods
    base.extend ClassMethods
  end

  module InstanceMethods
    def m1
      'instance method'
    end
  end

  module ClassMethods
    def m2
      'this is class method'
    end
  end
end

class Test
  include Bbq
end  

 

测试:

irb(main):030:0> Test.m2
=> "this is class method"

irb(main):031:0> Test.m1
Traceback (most recent call last):
NoMethodError (undefined method `m1' for Test:Class)

irb(main):032:0> Test.new.m1
=> "instance method"

  

方法二:借助ActiveSupport::Concern

require 'active_support/concern'

module Bbq2  extend ActiveSupport::Concern

  def m1
    'instance method'
  end

  class_methods  do
    def m2
      'this is class method'
    end
  end
end

class Test2
  include Bbq2
end  

  

测试:

irb(main):019:0> Test2.m2
=> "this is class method"
irb(main):020:0> Test2.m1
Traceback (most recent call last):
NoMethodError (undefined method `m1' for Test2:Class)
irb(main):021:0> Test2.new.m1
=> "instance method"

  

posted @ 2019-09-03 15:55  柒零壹  阅读(249)  评论(0编辑  收藏  举报