在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}
。而且,由于密钥必须是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
s是可变的。就像List
s一样,所以那真的行不通。
那你想达到什么目的呢?如果数组中值的顺序不重要,则可以使用Set
s作为键:
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] 删除。
我来说两句