2017-05-30 18 views
7

Perl5 ve Moose, lineer is veya doğrusallaştırılmış isa, sınıf hiyerarşilerini anlamlandırmaya yardımcı olur. Bir değerin somut türünü gösterir WHATBir değerin hiyerarşisini nasıl gösterirsiniz?

yöntemi:

> 42.WHAT 
(Int) 

Nasıl muhtemelen her tüketilen rolü için daha ileri hatları ile

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

gibi bir şey ... gösteriyor?


düzenleme: rolleri

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

'gelmez .WHAT' Herhangi bir şey, size tip nesnesini verir. Hangisi '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' yarı-duyarlı bir şeye '. Gerçekten aramalıydın. –

cevap

8

için

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

meta nesne sorgulayabilir iki ipliği ile, örneğin burada mro standı yöntem çözünürlüğü sırası ve

> 42.^roles 
((Real) (Numeric)) 
için

:local zarfları aracılığıyla hangi rollerin döndürüleceğini kontrol edebilirsiniz (üst sınıflardan miras alınan roller hariç - yalnızca sınıflarda kullanılabilir) ve :!transitive (başka bir rolden oluşan rolleri hariç tut - her iki rol ve sınıfta kullanılabilir). Aşağıdaki başlangıç ​​almalısınız


:

küçük değişiklikler

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

o çıktı üretir ile örnek kod Verilen

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

Üzgünüz, zarf kısmını anlamıyorum. Düzenlediğim yazımda ikinci örnekle örnek olabilir misiniz? – daxim

+1

@daxim Bir [zarf] (https://docs.perl6.org/language/glossary#Adverb), işlevlerin ne yaptığını değiştiren adlandırılmış bir bağımsız değişkentir. Örneğin, ':! Transitive' kelimesinin geçmesi, 'trans' ('trans') '(http://www.dictionary.com/browse/transitively) olan rolleri ortadan kaldırır. ('' '' '' Değil '' anlamına gelir, yani ':! 'Geçişli', İngilizce geçici ifadesine '' geçici olarak değil '' benzemektedir. Bu yüzden kodunuzda $ ai.^Rolleri (:! Geçişli)' deyin. (Epsilon) (Gama)). – raiph

+1

Bu, ekosistemde güzel bir yardımcı modül gibi görünüyor. *ipucu ipucu* :-) –

İlgili konular