9

Perl クラスのすべてのスーパークラス (またはより良いのは、UNIVERSAL までのスーパークラス ツリー全体) を見つける標準的な CPAN の方法はありますか?

@{"${$class}::ISA"}または、各クラス、クラスの親などを単純に調べるのがベストプラクティスですか?

4

4 に答える 4

9

これはあなたがやりたい標準的なことではないので、「標準的な方法」はありません。視覚化以外の場合、継承ツリーを検査したいのはオブジェクト指向の危険信号です。

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
于 2012-06-03T17:07:46.383 に答える
5

Class::ISAはあなたが探しているようなものだと思います

use Class::ISA;
use Mojolicious;
print join "\n", Class::ISA::super_path("Mojolicious");

版画:

Mojo
Mojo::Base

ただし、タスク全体が Perl プログラマーが毎日行うものではないため、これはある種の「ベスト プラクティス」ではありません。

于 2012-06-03T15:36:47.160 に答える
1

最近ではmro、 などの の機能の 1 つを使用したいと思うでしょうmro::get_linear_isa

use mro;
my @superclasses = mro::get_linear_isa($class);
于 2012-06-12T10:38:50.140 に答える
0

「標準的な CPAN のやり方」のようなものがあるとは思えません。調べる@ISAことは一般的なuse base qw(...)方法use parent -norequire, ...です@ISA

于 2012-06-03T13:09:50.853 に答える