[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"

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章