簡體   English   中英

查找 Perl 類的所有超類的最佳實踐是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM