在Perl 6中,我可以使用数组作为哈希键吗?

亨特·麦克米伦

在Hash文档中,上的部分Object keys似乎暗示您可以将任何类型用作Hash键,但是您在尝试将数组用作键时遇到了麻烦:

> my %h{Array};
{}
> %h{[1,2]} = [3,4];
Type check failed in binding to parameter 'key'; expected Array but got Int (1)
in block <unit> at <unknown file> line 1

是否有可能做到这一点?

伊丽莎白·马蒂森(Elizabeth Mattijsen)

[1,2]内部%h{[1,2]} = [3,4]被解释为一个切片。因此,它尝试分配%h{1}%{2}而且,由于密钥必须是Array,因此不能很好地进行类型检查。错误消息告诉您的是什么。

如果逐项列出数组,则它“起作用”:

my %h{Array};
%h{ $[1,2] } = [3,4];
say %h.perl;  # (my Any %{Array} = ([1, 2]) => $[3, 4])

但是,这可能无法得到您想要的,因为:

say %h{ $[1,2] };  # (Any)

这是因为对象散列将.WHICH方法的值用作基础数组中的键。

say [1,2].WHICH; say [1,2].WHICH;
# Array|140324137953800
# Array|140324137962312

请注意,.WHICH这些看似相同的数组值是不同的。那是因为Arrays是可变的。就像Lists一样,所以那真的行不通。

那你想达到什么目的呢?如果数组中值的顺序不重要,则可以使用Sets作为键:

say [1,2].Set.WHICH; say [1,2].Set.WHICH
# Set|AEA2F4CA275C3FE01D5709F416F895F283302FA2
# Set|AEA2F4CA275C3FE01D5709F416F895F283302FA2

请注意,这两个.WHICH是相同的。所以你可以这样写:

my %h{Set};
dd %h{ (1,2).Set } = (3,4); # $(3, 4)
dd %h; # (my Any %{Set} = ((2,1).Set) => $(3, 4))

希望这可以澄清事情。有关更多信息,访问:https : //docs.raku.org/routine/WHICH

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章