是否有标准的CPAN方法来查找Perl类的所有超类(或者更好的整个超类树,直到UNIVERSAL)?
或者,只是简单地检查每个班级,班级的父母等的@{"${$class}::ISA"}
是最佳做法吗?
答案 0 :(得分:8)
没有“标准方式”,因为这不是您想要做的标准事情。对于除了可视化以外的任何东西,想要检查继承树是一个OO红旗。
除了Class :: ISA之外,还有mro::get_linear_isa()。两者都已经存在核心一段时间,所以它们可以被认为是某些定义的“标准”。这两个都将继承显示为一个平面列表,而不是一个树,这对于深层魔法很有用。
perl5i meta object同时提供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
答案 1 :(得分:4)
我认为Class::ISA就像你在寻找
use Class::ISA;
use Mojolicious;
print join "\n", Class::ISA::super_path("Mojolicious");
打印:
Mojo
Mojo::Base
然而,这并不是某种“最佳实践”,因为整个任务不是Perl程序员每天都在做的事情。
答案 2 :(得分:1)
我不相信有类似“标准CPAN方式”的东西。检查@ISA
是常见做法 - 也是合理的,因为use base qw(...)
和use parent -norequire, ...
等技术也在@ISA
之上运作......
答案 3 :(得分:0)
如今,您最有可能想要使用mro
中的一项功能,例如mro::get_linear_isa
。
use mro;
my @superclasses = mro::get_linear_isa($class);