2017-05-30 13 views
7

Perl5およびMooseでは、線形isaまたはlinearized 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

'doesnの.WHAT'何か、それはあなたに型オブジェクトを与えます。 '::'を持たないタイプの場合、 '.gist'は途中で賢明なものになります。あなたは本当に '。^ name'を呼ぶべきです。 –

答えて

8

の二本鎖であなたは

mroメソッド解決順序のために立って、

> 42.^roles 
((Real) (Numeric)) 
> 42.^mro 
((Int) (Cool) (Any) (Mu)) 

とメタオブジェクトを照会することができます

サブクラス: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 {} 

それが出力を生成して、あなたのコード例を考えると

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)); 
} 

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

申し訳ありませんが、私は副詞の部分を理解していません。編集した投稿の2番目の例を例に挙げることはできますか? – daxim

+1

@daxim [adverb](https://docs.perl6.org/language/glossary#Adverb)は、関数の動作を変更する名前付き引数です。たとえば、 ':!transitive'を渡すと、[推論的に](http://www.dictionary.com/browse/transitively)であるロールが削除されます。あなたのコードで$ ai。^ roles(:!transitive) 'とすると、'((!推移的ではない) (イプシロン)(ガンマ))」。 – raiph

+1

これは、生態系の素敵なユーティリティモジュールのような感じです。 *ヒントヒント* :-) –

関連する問題