2017-05-30 17 views
7

W języku Perl5 i Moose, liniowy isa lub zlinearyzowany isa pomaga zrozumieć hierarchie klas.Jak wyświetlić hierarchię typów wartości?

Sposób WHAT pokazuje konkretny rodzaj wartości:

> 42.WHAT 
(Int) 

Jak mogę pokazać coś podobnego

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

... ewentualnie z kolejnych wierszy dla każdej zużytej roli?


edit: przykład z dwóch nici ról

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' robi "t _show_ cokolwiek, daje ci obiekt typu. Które dla typów, które nie mają żadnego '::' w nich '.gist' do czegoś w połowie sensownego. Powinieneś naprawdę nazywać '.^Name'. –

Odpowiedz

8

Można zapytać meta obiekt z

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

gdzie mro stojak na metody rozdzielczość rzędu i

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

Możesz kontrolować, które role są zwracane za pomocą przysłówków :local (wyklucz role powiązane z klasami nadrzędnymi - dostępne tylko w klasach) i :!transitive (wyklucz role przypisane przez inną rolę - dostępne w obu rolach i klasach).


Poniższa powinno Ci zacząć:

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

Biorąc pod uwagę Twój przykładowy kod z niewielkimi modyfikacjami

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 {} 

produkuje wyjście

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

Niestety, nie rozumiem części przysłówka. Czy możesz podać przykład drugiego przykładu w moim edytowanym poście? – daxim

+1

@daxim An [przysłówek] (https://docs.perl6.org/language/glossary#Adverb) to nazwany argument modyfikujący działanie funkcji. Na przykład, przekazanie ':! Transitive' powoduje odrzucenie ról, które' wykonują' [przechodnie] (http://www.dictionary.com/browse/transitively). ("!" Oznacza "nie", tzn. ':! Transitive' jest analogiczne do angielskiego przysłówkowego wyrażenia" nie przechodnie "). Więc' powiedz $ ai.^Role (:! Transitive) 'z twoim kodem wyświetla właśnie' ((Epsilon) (Gamma)) '. – raiph

+1

To wydaje się być miłym modułem użytkowym w ekosystemie. *podpowiedź podpowiedź* :-) –

Powiązane problemy