rails concern

rails ActiveSupport::Concern封装了包含并扩展技术,解决了链式包含的问题一个模块可以通过扩展Concern模块来实现包含并扩展的功能。
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时调用,该方法实现把模块加入base的祖先链中,通过@_dependencies记录模块的继承关系,分别并把 class_methods 或 ClassMethods 里的块使用module_eval定义为类方法,进而实现扩展
使用如下

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

完美实现了链式包含的问题

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,053评论 3 119
  • 反思昨天及前几天所思所想,发现自己的安全感不是一般的欠缺,自己安排不好时间及事情不面对困难,不找自己的原因,不去根...
    花草姐姐阅读 1,382评论 1 1
  • 昨天跟朋友说太忙了,中午的聚会不能去了,朋友还说,忙好啊,很充实… 我没回他,因为我觉得并不充实,而是在浪费时间。...
    爱尽生活阅读 1,387评论 0 0
  • 人面不知何处去,桃花依旧笑春风。那年大火带走的不只是你的容颜,还有我的毕生幸运。为了家仇国恨,...
    冰萱萱阅读 1,850评论 0 0
  • 在现代生活中,人都面临着环境污染、睡眠不足、缺乏运动和压力过大等多重影响,健康受到负面的压力。在面对种种挑战...
    逸馨姐阅读 4,369评论 0 2

友情链接更多精彩内容