ActiveSupport::Concern

ruby中典型的module应该这样写,当这个module被其他类include的时候
会自动出发included方法,base.extend则为这个类扩展了ClassMethods
中的方法,而在base.class_eval中即可以添加实例方法,也可以添加类方法

```ruby
module M
    def self.included(base)
        base.extend ClassMethods
        base.class_eval do

            #instance method
            def sleep
                puts "sleeping..."
            end

            #class method
            def self.eat
                puts "eat dinner.."
            end
        end
    end

    module ClassMethods
        #class methods
        def say
            puts "say hello.."
        end
    end
end
```

使用AcitveSupport::Concern写module,实现了上述功能,但是简化了很多代码
只需要extend ActiveSupport::Concern即可

```ruby
module M
    extend ActiveSupport::Concern
   
    included do
      def sleep
          puts "sleeping.."
      end

      def self.eat
          puts "eat dinner.."
      end
    end

    module ClassMethods
        def say
            puts "say hello.."
        end
    end
end
```

运行上述两端代码,结果是相同的
```ruby
class A
    include M
end

A.say
A.eat
A.new.sleep
```



你可能感兴趣的:(concern)