2017-07-09 3 views
8

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)} 
+3

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

+0

Próbowałem wrzucić tam zlew i zobaczyłem, że zadziałało. Dziwny. –

+0

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. –

Odpowiedz

1

Jest to bug. Naprawiono jako z Rakudo 2018.02.1-45-g8a10fc1