??????????????????????C' ??????′?????????????? C ????????????????????????????????????????????? C.ancestors ??????? C ???????????????????????????? C.ancestors ????ι??????
????????????? Module#ancestors ?????????????????????
VALUE
rb_mod_ancestors(VALUE mod)
{
VALUE p?? ary = rb_ary_new();
for (p = mod; p; p = RCLASS_SUPER(p)) {
if (FL_TEST(p?? FL_SINGLETON))
continue;
if (BUILTIN_TYPE(p) == T_ICLASS) {
rb_ary_push(ary?? RBASIC(p)->klass);
}
else if (p == RCLASS_ORIGIN(p)) {
rb_ary_push(ary?? p);
}
}
return ary;
}
?????ú??????????????????飬?????????????????????????????????????????????????????????????????????檔????????????????????
???????????????????????????C.ancestors ????а? C ???????????????????????????????? origin ???????????? C.ancestors ??????????е? C ????? C ??????????? C ????????????????? C ????????
?????????????????????????????????????????????????Щ?????????????????????????????????????顣???????????????????????????????????????????????????????????????????
A = Module.new
module B
def bar; 'B' end
end
module C
include A?? B
end
class D
include A
prepend C
def bar; 'D' end
end
D.new.bar # => 'D'
?????? D ???????? C ????????????? A??????У???????? D ?????? C ????D ?? C ?????????????????? D ?????? C ???D ??????????
????+---+    +---+    +--------+
????| D |--->| A |--->| Object |
????+---+    +---+    +--------+
????+---+    +---+    +---+    +--------+
????| C |--->| A |--->| B |--->| Object |
????+---+    +---+    +---+    +--------+
????|
????+-----------------+  A ??ò????????? D' ?????
????|
????v
????+---+    +---+    +---+    +---+    +---+    +--------+
????| D |--->| C |--->| D'|--->| A |--->| B |+-->| Object |
????+---+    +---+    +---+    +---+    +---+    +--------+
??????????б????????????? A ???????ò????????? D' ????棬???? B λ?? D' ????檔???? D.new.bar ????? 'D' ?????? 'B'??
?????????????????????????? Ruby ??????????????????÷?????????????????????ι???????????????????????????