是否有一种标准的 CPAN 方法可以找出 Perl 类的所有超类(或者更好的是整个超类树,直到 UNIVERSAL)?
或者最好的做法是简单地检查@{"${$class}::ISA"}
每个班级、班级的父母等?
是否有一种标准的 CPAN 方法可以找出 Perl 类的所有超类(或者更好的是整个超类树,直到 UNIVERSAL)?
或者最好的做法是简单地检查@{"${$class}::ISA"}
每个班级、班级的父母等?
没有“标准方式”,因为这不是您想做的标准事情。对于除可视化之外的任何事情,想要检查您的继承树是一个面向对象的危险信号。
除了 Class::ISA,还有mro::get_linear_isa()。两者都处于核心地位已经有一段时间了,因此它们可以被认为是某些定义的“标准”。两者都将继承显示为平面列表,而不是树,这主要用于深度魔法。
perl5i元对象同时提供了linear_isa(),如 mro (它只是调用 mro)和返回 class' 的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
......