有没有标准的CPAN方法来找出Perl类的所有超类(或者更好的是整个超类树,直到UNIVERSAL)?
还是最佳做法是简单地检查每个班级、班级家长等的@{"${$class}::ISA"}
?
没有"标准方法",因为这不是你想要做的标准事情。 对于可视化以外的任何内容,想要检查继承树都是 OO 危险信号。
除了 Class::ISA 之外,还有 mro::get_linear_isa()。 两者都在核心中存在了一段时间,因此它们可以被视为某些定义的"标准"。 两者都将继承显示为平面列表,而不是树,这主要用于深奥魔法。
perl5i 元对象同时提供 linear_isa(),如 mro(它只是调用 mro)和 ISA(),它返回类的@ISA
。 它可用于使用简单递归构造树,而无需进入符号表。
use perl5i::2;
func print_isa_tree($class, $depth) {
$depth ||= 0;
my $indent = " " x $depth;
say $indent, $class;
for my $super_class ($class->mc->ISA) {
print_isa_tree($super_class, $depth+1);
}
return;
}
my $Class = shift;
$Class->require;
print_isa_tree($Class);
__END__
DBIx::Class
DBIx::Class::Componentised
Class::C3::Componentised
DBIx::Class::AccessorGroup
Class::Accessor::Grouped
我认为 Class::ISA 就像你正在寻找的东西
use Class::ISA;
use Mojolicious;
print join "n", Class::ISA::super_path("Mojolicious");
指纹:
Mojo
Mojo::Base
然而,这不是某种"最佳实践",因为整个任务不是Perl程序员每天都要做的事情。
这些天您很可能想使用 mro
中的函数之一,例如 mro::get_linear_isa
。
use mro;
my @superclasses = mro::get_linear_isa($class);
我不相信有"标准CPAN方式"之类的东西。检查@ISA
是常见的做法 - 也是合理的,因为像use base qw(...)
和use parent -norequire, ...
这样的技术也在@ISA
之上运行......