从Perl 6中的数组值的哈希中检索数据

问题描述 投票:3回答:1

我有一个包含3个元素的数组:

my @a = <x y z>;

然后我用Array值制作哈希值,并使@a的内容成为其值之一:

my Array %h;
%h<a> = @a;

稍后我检索此值并将其分配给另一个数组:

my @A = %h<a>;

但是我在@A中获得的不是一个包含3个元素的数组,而是一个元素的数组,它本身就是一个包含3个元素的数组:

say @A;          # [[x y z]]
say @A[0].elems; # 3

因此,%h<a>被加入了push

我的代码中的错误在哪里?

UPD:这似乎解决了这个问题,但并没有提高我的理解力。 :)

@A
perl6
1个回答
5
投票

发生这种情况的原因是,必须将数组 = @a; Later I retrieve this value and ...放入容器中以允许存储为@a中的值。当存储到数组Hash中时,容器内的某些东西将保留在容器中。所以,你需要的是在分配给@A时摆脱容器。你的解决方案是摆脱容器的一种方法,但这会产生一个中间的@A,这对于大型阵列来说可能会变得昂贵。

正如我所说,你需要摆脱容器。幸运的是,我们有一个语法:postfix List

<>

如果你真的希望my @a = <a b c>; my %h = a => @a; my @b = %h<a><>; # <-- note the <> here dd @b; # Array @b = ["a", "b", "c"] 是可变的,这将是最有效的方式。或者,如果你想让@b只是原始@b的别名,你也可以绑定:

@a

请注意,my @a = <a b c>; my %h = a => @a; my @b := %h<a>; # <-- note the := here dd @b; # Array @a = ["a", "b", "c"] 输出现在显示dd作为名称,因为它现在与@a相同:@a的任何更改现在也将显示在@a中,反之亦然。如果你还没有改变它们,那也没关系。如果在你的情况下这是真的,那么这将是最有效的方式,无论是CPU还是内存。

© www.soinside.com 2019 - 2024. All rights reserved.