Rozważ ten program, w którym utworzę hasz. Chcę następnie zmienić dwie wartości w nim:Który kontekst myli tego operatora z Zip 6?
my $hash = %(
wallet => 100,
gave => 0,
received => 0,
);
for ^1 { $hash<wallet gave> Z+= <-1 1> };
dd $hash;
Jak to ostatnia linia for
nic nie robi i nie ma ostrzeżenia. Hash jest niezmienna:
Hash $hash = ${:gave(0), :received(0), :wallet(100)}
Dodanie kolejnego komunikatu zmienia zachowanie:
my $hash = %(
wallet => 100,
gave => 0,
received => 0,
);
for ^1 { $hash<wallet gave> Z+= <-1 1>; True };
dd $hash;
Teraz inplace edit robi jego rzecz, ale tam ostrzeżenie (choć spór „bezużyteczny”, gdy znalazłem zastosowanie do niego):
Useless use of constant value True in sink context
Hash $hash = ${:gave(1), :received(0), :wallet(99)}
Jeśli zrobić bez Z+=
, które powinno być to samo, to działa:
my $hash = %(
wallet => 100,
gave => 0,
received => 0,
);
for ^1 { $hash<wallet gave> = $hash<wallet gave> Z+ <-1 1> }
dd $hash;
Znowu prawy Wyjście:
Hash $hash = ${:gave(1), :received(0), :wallet(99)}
To wygląda jak błąd. Prawdopodobnie błąd obsługi kontekstu zlewu. 'for^1 {sink $ hash Z + = <-1 1>};' lub 'dla^1 {powiedz $ hash Z + = <-1 1>};' oba dają poprawne wyniki. –
raiph
Próbowałem wrzucić tam zlew i zobaczyłem, że zadziałało. Dziwny. –
FWIW, jakiej wersji Rakudo Perl 6 używasz? Przypominam błąd, który spowodował, że ostatnia wartość w pętli 'for' nie została ostatnio naprawiona. –