在Perl5和Moose中,线性isa或线性化isa有助于理解类层次结构。

方法WHAT显示值的具体类型:

> 42.WHAT
(Int)


我如何显示类似

> 42.hypothetical-type-hierarchy
(Int) ┬ is (Cool) ─ is (Any) ─ is (Mu)
      └ does (Real) ─ does (Numeric)


……可能需要为每个角色扮演更多角色?



编辑:具有两个角色的示例

class Beta {}
role Delta {}
role Gamma does Delta {}
role Eta {}
role Zeta does Eta {}
role Epsilon does Zeta {}
class Alpha is Beta does Gamma does Epsilon {}

# (Alpha) ┬ is (Beta)
#         ├ does (Gamma) ─ does (Delta)
#         └ does (Epsilon) ─ does (Zeta) ─ does (Eta)

my $ai = Alpha.new
$ai.^mro        # ((Alpha) (Beta) (Any) (Mu))

$ai.^roles      # ((Epsilon) (Zeta) (Eta) (Gamma) (Delta))
                # flat list, not two-element list of a tuple and triple‽

最佳答案

您可以使用以下命令查询元对象

> 42.^mro
((Int) (Cool) (Any) (Mu))


其中mro代表方法解析顺序,而

> 42.^roles
((Real) (Numeric))


您可以控制通过副词:local(不包括从父类继承的角色-仅在类中可用)和:!transitive(不包括通过另一个角色组成的角色-在角色和类中均可用)返回的角色。



以下内容将帮助您入门:

my $depth = 0;
for Alpha.^mro {
    say "is {.^name}";
    (sub {
        ++$depth;
        for @_ {
            say '  ' x $depth ~ "does {.^name}";
            &?ROUTINE(.^roles(:!transitive)); # recursive call of anon sub
        }
        --$depth;
    })(.^roles(:local, :!transitive));
}


给您的示例代码稍作修改

role Delta {}
role Gamma does Delta {}
role Eta {}
role Zeta does Eta {}
role Epsilon does Zeta {}
class Beta does Gamma {}
class Alpha is Beta does Gamma does Epsilon {}


它产生输出

is Alpha
  does Epsilon
    does Zeta
      does Eta
  does Gamma
    does Delta
is Beta
  does Gamma
    does Delta
is Any
is Mu

关于raku - 您如何显示值的类型层次结构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44255424/

10-11 06:33
查看更多