2016-03-14 21 views
8

Aby zapisać 2 wartości z listy zwróconej przez okręt podwodny i wyrzucić trzecią z nich, można;Dlaczego przypisanie do listy zmiennych jest niespójne?

(my $first, my $second) = (1, 2, 3); 
print $first, "\n"; 
print $second, "\n"; 
exit 0; 

i działa zgodnie z oczekiwaniami (zarówno w perl5 jak i perl6). Jeśli chcesz tylko pierwszy;

(my $first) = (1, 2, 3); 
print $first, "\n"; 
exit 0; 

... otrzymujesz całą listę. Wydaje się to sprzeczne z intuicją - dlaczego ta niespójność?

Odpowiedz

9

To powinno być spowodowane single argument rule. Osiągnięcia oczekiwanego zachowania dodając spływu ,:

(my $first,) = (1, 2, 3); 

pamiętać, że to działa jak deklaracje powrotu pojemników, które są pierwszej klasy obiektów, które mogą być umieszczone w wykazach, jesteś mimo to robi to „złego” :

zadania powinien przeczytać

my ($first, $second) = (1, 2, 3); 

i

my ($first) = (1, 2, 3); 

Należy również zauważyć, że pareny po prawej stronie również są zbędne (to przecinek, który tworzy listę); wersje bardziej idiomatyczne byłoby

my ($first, $second) = 1, 2, 3; 

i

my ($first) = 1, 2, 3; 
+0

Nie do końca rozumiem, dlaczego "my ($ first) = 1,2,3"; * działa * zgodnie z przeznaczeniem. Czy nie powinien obowiązywać tam również pojedynczy argument? Innymi słowy, jak to się różni od '(my $ first) = 1,2,3;' lub 'my $ first; ($ first) = 1,2,3; '? – mscha

+0

@mscha: parens są przeciążone syntaktycznie: są używane jako część składni deklaracji, a także do rozgraniczania zwykłych list (które mogą zawierać rzeczy, które można przypisać); syntaktycznie może wyglądać podobnie, ale semantycznie, jabłka i pomarańcze – Christoph

+0

@mscha: ze względu na konsystencję, dobrym pomysłem byłoby uczynienie reguł tymi samymi, ale pamiętaj, że lista sematyczna ewoluowała podczas dość długiego procesu programowania Perl6 – Christoph

6
(my $first,) = (1,2,3); 
dd $first; # OUTPUT«Int $first = 1␤» 

W pierwszym przykładzie można przypisać listę (lub jego części) do listy kontenerów. Twój drugi przykład robi dokładnie to, o co go poprosiłeś. Lista wartości jest przypisana do jednego kontenera. W Perlu 5 lista jest konstruowana przez nawiasy (w tym przypadku), przy czym w Perlu 6 lista jest konstruowana przez przecinek. Ten drugi jest używany w moim przykładzie, aby uzyskać to, o co prosi.

Twierdzę, że Perl 5 jest niespójny, ponieważ czasami listy są konstruowane przez przecinki, nawiasy lub nawiasy.

my ($first,$,$third) = (1,2,3); 
dd $first, $third; # OUTPUT«Int $first = 1␤Int $third = 3␤» 

Można pominąć jeden lub wiele elementów listy, dodając anonimowe zmienne stanu. Prowadzi to również do skrótu do pierwszego przykładu.

my $first,$ = 1,2,3; 
dd $first; # OUTPUT«Any $first = Any␤» 
Powiązane problemy