gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:42:04 27 4
gpt4 key购买 nike

在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

是否有可能做到这一点?

最佳答案

[1,2]中的%h{[1,2]} = [3,4]被解释为切片。因此,它尝试分配%h{1}%{2}。而且,由于 key 必须是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值是不同的。
那是因为 Array是可变的。就像 List一样,所以这实际上是行不通的。

那你想达到什么目的呢?如果数组中值的顺序不重要,则可以将 Set用作键:
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

关于arrays - 在Perl 6中,我可以使用数组作为哈希键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50051041/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com