rails concern

rails ActiveSupport::Concern封裝了包含并擴展技術,解決了鏈式包含的問題一個模塊可以通過擴展Concern模塊來實現(xiàn)包含并擴展的功能。
concern.rb 代碼如下

module ActiveSupport
module Concern
    class MultipleIncludedBlocks < StandardError #:nodoc:
      def initialize
        super "Cannot define multiple 'included' blocks for a Concern"
      end
    end

    def self.extended(base) #:nodoc:
      base.instance_variable_set(:@_dependencies, [])
    end

    def append_features(base)
      if base.instance_variable_defined?(:@_dependencies)
        base.instance_variable_get(:@_dependencies) << self
        false
      else
        return false if base < self
        @_dependencies.each { |dep| base.include(dep) }
        super
        base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods)
        base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block)
      end
    end

    def included(base = nil, &block)
      if base.nil?
        raise MultipleIncludedBlocks if instance_variable_defined?(:@_included_block)

        @_included_block = block
      else
        super
      end
    end

    def class_methods(&class_methods_module_definition)
      mod = const_defined?(:ClassMethods, false) ?
        const_get(:ClassMethods) :
        const_set(:ClassMethods, Module.new)

      mod.module_eval(&class_methods_module_definition)
    end
  end
end

append_features 是在模塊被include時調(diào)用,該方法實現(xiàn)把模塊加入base的祖先鏈中,通過@_dependencies記錄模塊的繼承關系,分別并把 class_methods 或 ClassMethods 里的塊使用module_eval定義為類方法,進而實現(xiàn)擴展
使用如下

require 'active_support'
module A
  def a_class_method
    puts 'a_class_method'
  end
end

module B
  extend ActiveSupport::Concern
  class_methods do
     def b_class_method
         puts 'b_class_method'
     end
    include A
  end
end

class X
   include B
end
X.a_class_method
X.b_class_method

完美實現(xiàn)了鏈式包含的問題

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,203評論 3 119
  • 反思昨天及前幾天所思所想,發(fā)現(xiàn)自己的安全感不是一般的欠缺,自己安排不好時間及事情不面對困難,不找自己的原因,不去根...
    花草姐姐閱讀 201評論 1 1
  • 昨天跟朋友說太忙了,中午的聚會不能去了,朋友還說,忙好啊,很充實… 我沒回他,因為我覺得并不充實,而是在浪費時間。...
    愛盡生活閱讀 192評論 0 0
  • 人面不知何處去,桃花依舊笑春風。那年大火帶走的不只是你的容顏,還有我的畢生幸運。為了家仇國恨,...
    冰萱萱閱讀 306評論 0 0
  • 在現(xiàn)代生活中,人都面臨著環(huán)境污染、睡眠不足、缺乏運動和壓力過大等多重影響,健康受到負面的壓力。在面對種種挑戰(zhàn)...
    逸馨姐閱讀 962評論 0 2

友情鏈接更多精彩內(nèi)容