概念
祖先链:通俗点就是找到一个类的祖宗(BaseObject)过程中的路径
祖先链.png组成
祖先链由类和其超类 以及module 组成
每一个对象(obj)都属于一个类(class), class的超类是Object, Object的超类是BasicObject, 在这个过程中可能还引入了module, module 也是祖先链中的一环。
当一个类(模块)包含一个模块,ruby 就会把这个模块加入祖先链中,其位置在包含这个模块的类之上。
module M1
def my_method
#do something
end
end
class C
include M1
end
class D < C; end
D.ancestors #=> [D, C, M1, Object, Kernel, BasicObject]
从ruby2.0开始,引入模块的方式有两种,include 和 prepend, 两者的区别在与 include: 引入的模块会在祖先链其包含它的该类的上方; prepend 引入的模块会在其祖先链包含它的该类的下方
注意:
多重引入:
当某个module 已经在祖先链中时,ruby 会忽略其他对该类的引用,即某个module 只会在祖先链中出现一次。
内核模块kernel:
Object 包含了kernel 模块,故而每一个类的祖先链中都包含有kernel,
网友评论