[英]What is the best practice for finding all the superclasses of a Perl class?
是否有一種標准的 CPAN 方法可以找出 Perl 類的所有超類(或者更好的是整個超類樹,直到 UNIVERSAL)?
或者是簡單地檢查每個班級、班級家長等的@{"${$class}::ISA"}
的最佳做法?
沒有“標准方式”,因為這不是您想做的標准事情。 對於可視化以外的任何事情,想要檢查您的繼承樹都是面向對象的危險信號。
除了 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
之上運行...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.