热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在Perl6中,我可以使用数组作为哈希键吗?》经验,为你挑选了1个好方法。

在Hash文档中,部分Object keys似乎暗示您可以使用任何类型作为哈希键,只要您指出但我在尝试使用数组作为键时遇到问题:

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

是否有可能做到这一点?



1> Elizabeth Ma..:

[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是可变的.由于List可以均为,所以这不是真正去上班.

那么你想要实现什么目标?如果数组中值的顺序不重要,则可以使用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.perl6.org/routine/WHICH


很好的答案,但民间可能会读到你写的内容,说不能使用数组.但这只是文字问题 - "我的%h {数组}; 我的@array = 5,6; %h {$ @ array} ='foo'; 说%h {$ @ array}; #foo`工作正常,你甚至可以修改数组,它仍然可以工作:`@array = 7,8; @ array.append:9,42; 说%h {$ @ array}; #foo`.另外:`%h {$ @ array} = $ @ array`可能会将数组保持为键,数组的值保持为关联值(未经测试,我需要上床睡觉).
推荐阅读
author-avatar
392399224_619416
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有