2017-08-21 53 views
6

W doc.perl6.org, widziałem wiele metod tak:Co oznacza drugi dwukropek w "Liście: D:" w Perlu 6?

method sum(List:D: --> Numeric:D) 

I konw List:D to rodzaj listy, która jest zdefiniowana, ale co dwukropek po D myśli (czyli drugi w List:D:)?

znalazłem pewne wyjaśnienia w S12-objects:

= head2 Invocants

Oświadczenie invocant jest opcjonalne. Zawsze możesz uzyskać dostęp do aktualnego invocanta , używając słowa kluczowego self. ... Aby zaznaczyć wyraźną invocant, wystarczy umieścić dwukropek po nim:

method doit ($x: $a, $b, $c) { ... } 

ale nie rozumieją, że to nieco dziwne na pierwszy rzut oka.

+1

Zobacz także artykuł doktora GitHub Perl6 [1121] (https://github.com/perl6/doc/issues/1121): Invocant metody dokumentu. –

Odpowiedz

6

Sposobami domyślne mają invocant z self

więc oba te byłyby równoważne:

method foo (  $a){…} 
method foo (\self: $a){…} # generates warning 

Więc rozszerzając pierwszy przykład, do jakiego jest sort-skrót

method sum(List:D \self: --> Numeric:D){…} # generates warning 

Zasadniczo piszesz to w ten sposób, jeśli chcesz określić typ inwokanta (pierwszy argument t) do metody, ale po prostu chcesz użyć self zamiast określać nową zmienną.


Powodem używa : podzielić się invocant od reszty parametrów jest uproszczenie wspólnej sprawy, gdzie nie określają invocant lub typ invocant.

1

Po zdefiniowaniu sub z typu podstawowego ograniczenia jak ten:

sub testB (Str $b) { say $b; } 

następnie można nazwać to z rzeczywistego wystąpienia danego rodzaju, a także z obiektem typu sama:

> testB("woo") 
woo 
> testB(Str) 
(Str) 

: D to dodatkowy typ ograniczenia, więc można tylko przekazać "zdefiniowana" instancję:

sub testC (Str:D $c) { say $c; } 
> testB(Str) 
(Str) 
> testC("hoo") 
hoo 
> testC(Str) 
Parameter '$c' of routine 'testC' must be an object instance of type 'Str', not a type object of type 'Str'. Did you forget a '.new'? 
    in sub testC at <unknown file> line 1 
    in block <unit> at <unknown file> line 1 

Więcej szczegółów można znaleźć: here

+1

Wierzę, że chenyf pytał o drugi dwukropek w definicji typu, a nie pierwszy. Nie 'Str: D', ale' Str: D: '. – piojo

+0

To była też moja pierwsza myśl. Zaktualizowałem pytanie, aby było bardziej zrozumiałe. –

+0

dzięki Christopher Bottoms – chenyf