Имеет ли Perl 6 эквивалент метода обновления Python в словаре?
В Python, если я обновляю словарь dict
другим dict под названием u
(используйте Perl
как ключ), он обновит значение:
>>> dict = {'Python':'2', 'Perl' : 5}
>>> u = {'Perl' : 6}
>>> dict.update(u)
>>> dict
{'Python': '2', 'Perl': 6}
но в Perl 6:
> my %hash = 'Python' => 2, Perl => 5;
> my %u = Perl => 6
> %hash.append(%u)
{Perl => [5 6], Python => 2}
Итак, имеет ли Perl 6 эквивалент метода обновления Python в словаре?
Ответы
Ответ 1
Вы можете использовать оператор ,
для выполнения обновления:
my %u = Perl => 6;
my %hash = 'Python' => 2, Perl => 5;
%hash = %hash, %u;
say %hash; # => {Perl => 6, Python => 2}
И, конечно, вы можете сократить линию обновления до
%hash ,= %u;
Ответ 2
В Perl 6 один вариант состоит в использовании хэш-фрагмента:
my %u = (Perl => 6);
%hash{%u.keys} = %u.values;
Результат
{Perl => 6, Python => 2}
Ответ 3
И если вам не нравится какой-либо из них, сверните свой собственный...
sub infix:<Update>(%h , %u) { %h{ %u.keys } = %u.values }
my %hash = Python => 2, Perl => 5;
my %u = Perl => 6 , Rust => 4.5 ;
%hash Update %u ;
say "After: %hash.perl()" ; # After: {:Perl(6), :Python(2), :Rust(4.5)}
Вы также можете увеличить глобальный хеш-тип;
augment class Hash {
method update(%u) { self{ %u.keys } = %u.values }
}
%hash = Python => 2, Perl => 5;
%u = Perl => 6 , Rust => 4.5 ;
%hash.update: %u ;
say "After: %hash.perl()" ; # After: {:Perl(6), :Python(2), :Rust(4.5)}
.. но, поскольку это, пожалуй, самое главное в действии на расстоянии, вы должны признать, что знаете, что делаете, из-за того, что вы размещаете use MONKEY-TYPING
в верхней части своей программы