查找 Perl 类的所有超类的最佳实践是什么?



有没有标准的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之上运行......

相关内容

最新更新