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

标签 arrays hash hashmap key raku

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

相关文章:

java - 返回整数数组中特定值的索引

javascript - 从多个数组填充 HTML 表

java - 为什么我的冒泡排序代码打印出这些奇怪的东西?

java获取唯一的服务器ID以供引用

go - 如何在golang中将字节数组转换为map[string,string]

java - 在java中创建一个字符串列表,其中每个字符串都是元组列表(作为值)的键

java - 即使定义了类和参数,Java也找不到符号错误?

javascript - 如何将 Javascript 字符串转换为八位字节/字符数组?

perl - 在 perl 中返回函数的关联数组

python - 比较 python 字典列表与列顺序的公差