在Perl5和Moose中,线性isa或线性化isa有助于理解类层次结构.
WHAT方法显示了值的具体类型:
> 42.WHAT
(Int)
Run Code Online (Sandbox Code Playgroud)
我该如何表现出类似的东西
> 42.hypothetical-type-hierarchy
(Int) ? is (Cool) ? is (Any) ? is (Mu)
? does (Real) ? does (Numeric)
Run Code Online (Sandbox Code Playgroud)
...可能还有每个消费角色的更多行?
编辑:具有两个角色的示例
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?
Run Code Online (Sandbox Code Playgroud)
您可以使用查询元对象
> 42.^mro
((Int) (Cool) (Any) (Mu))
Run Code Online (Sandbox Code Playgroud)
其中,mro立场方法解析顺序和
> 42.^roles
((Real) (Numeric))
Run Code Online (Sandbox Code Playgroud)
您可以控制通过副词返回的: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));
}
Run Code Online (Sandbox Code Playgroud)
鉴于您的示例代码稍作修改
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 {}
Run Code Online (Sandbox Code Playgroud)
它产生输出
is Alpha
does Epsilon
does Zeta
does Eta
does Gamma
does Delta
is Beta
does Gamma
does Delta
is Any
is Mu
Run Code Online (Sandbox Code Playgroud)