2017-05-30 73 views
7

在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‽ 
+1

'.WHAT'沒有按顯示任何東西,它給你的類型對象。對於那些在'.gist'中沒有任何'::'的類型來說,它們變成了一些明智的選擇。你應該真的調用'。^ name'。 –

回答

8

可查詢

> 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 
+0

對不起,我不明白副詞部分。你能舉例說明我的編輯帖子中的第二個例子嗎? – daxim

+1

@daxim [副詞](https://docs.perl6.org/language/glossary#Adverb)是一個命名參數,用於修改函數的功能。例如,傳遞':!transitive'會刪除'''[transitively](http://www.dictionary.com/browse/transitively)「。 ('!'的意思是「不」,即':!transitive'類似於英語狀語短語「not transitively」。)所以'說出$ ai。^ roles(:!transitive)',你的代碼顯示爲' (Epsilon(伽瑪))'。 – raiph

+1

這感覺就像生態系統中的一個很好的實用程序模塊。 *提示提示* :-) –