ruby 使用 mixin 的时候是直接 copy 到原型链的,ancestors 返回的是一维数组,于是尝试了一下用 ancestors 还原出 include 和 prepend 的结构,调试的时候可以用到。
安装:
gem install pretty_ancestors
例子:
module M1
include (Module.new{})
end
module M2
include M1
end
module M3
end
module M4
prepend M3
end
module M5
end
class C
include M4
include M2
prepend M5
end
pp C.pretty_ancestors
# =>
# [[[M5], C, [[M2, [[M1, [#<Module:0x00000000f546f0>]]]], [[M3], M4]]],
# [Object,
# [PP::ObjectMixin, Kernel]],
# BasicObject]
pp C.pretty_ancestors(:raw)
# =>
# [[[[[], M5, []]],
# C,
# [[[], M2, [[[], M1, [[[], #<Module:0x00000000f546f0>, []]]]]],
# [[[[], M3, []]], M4, []]]],
# [[], Object, [[[], PP::ObjectMixin, []], [[], Kernel, []]]],
# [[], BasicObject, []]]
在 raw 数据中每个模块 M 都被表示为[[*prepended], M, [*included]]
,普通输出则是去掉了所有[]
的简化。对于 Class,pretty_ancestors 的第一维是继承链上的类。
C.pretty_ancestors.flatten
总是等于 C.ancestors
,所以可以直接按顺序确定优先级。
github: https://github.com/CicholGricenchos/pretty_ancestors
另求 pretty_print 调教经验。。