在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/