Perl クラスのすべてのスーパークラス (またはより良いのは、UNIVERSAL までのスーパークラス ツリー全体) を見つける標準的な CPAN の方法はありますか?
@{"${$class}::ISA"}
または、各クラス、クラスの親などを単純に調べるのがベストプラクティスですか?
Perl クラスのすべてのスーパークラス (またはより良いのは、UNIVERSAL までのスーパークラス ツリー全体) を見つける標準的な CPAN の方法はありますか?
@{"${$class}::ISA"}
または、各クラス、クラスの親などを単純に調べるのがベストプラクティスですか?
これはあなたがやりたい標準的なことではないので、「標準的な方法」はありません。視覚化以外の場合、継承ツリーを検査したいのはオブジェクト指向の危険信号です。
Class::ISA に加えて、mro::get_linear_isa()があります。どちらもしばらくの間コアにあったため、定義によっては「標準」と見なすことができます。どちらも継承をツリーではなくフラットなリストとして示しており、これは主に深い魔法に役立ちます。
perl5i メタ オブジェクトは、 mroのような linear_isa () (単に 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
、 などの の機能の 1 つを使用したいと思うでしょうmro::get_linear_isa
。
use mro;
my @superclasses = mro::get_linear_isa($class);
「標準的な CPAN のやり方」のようなものがあるとは思えません。調べる@ISA
ことは一般的なuse base qw(...)
方法use parent -norequire, ...
です@ISA
。