module
module(模块),主要两大功能: 1、提供命名空间 2、 Mix-in 扩展功能(模块混入) 特性: 1、不能拥有实例 2、不能被继承
一些用法:
- 可以用include 混入模块内方法为实例方法,
- 可使用self.included钩子可以实现 include时扩展 实例方法和类方法
- 可使用module_function定义模块的方法, 就可以使用:“模块名 . 方法名”的形式调用
- Module可以extend self 实现混入自己的方法为“类”方法
module Animal
def run
puts 'run'
end
end
module AnimalExt
def run
puts 'ext run'
end
def self.included(base) # 钩子,在被include时触发,base为include他的类
base.extend ClassMethods #为类方法
end
module ClassMethods
def eat
puts 'eat'
end
end
end
class Rabbit
include Animal #扩展实例方法
include AnimalExt # 实例方法优先级更高
extend Animal #扩展类方法
end
Rabbit.ancestors #[Rabbit, AnimalExt, Animal, Object, Kernel, BasicObject] 最后混入的在前面,查找方法时顺序查找
Animal.eat #获得的类方法
module X
module_function
def ha
puts 'ha'
end
end
X.ha #直接调用模块的方法
module Z
extend self
def e
puts 'e'
end
end
Z.e # 混入自己的方法变为“类”方法
拓展 Active::Support是rails对模块混入的一个扩展,解决依赖问题;主要解读参考:利用ActiveSupport::Concern来组织你需要include的module