如何解决如何在for中的哈希上使用排序
我有一个哈希%h
,并且我想按键的字母顺序处理for
语句中的数据。
但是,如果我在哈希上使用sort
,则会得到Pair
的列表,这是可以理解的。但是,如何为for
语句解包。
当前我正在使用以下内容:
my %h = <xabsu ieunef runf awww bbv> Z=> 1..*; # create a hash with random key names
for %h.sort {
my ($name,$num) = (.key,.value);
say "name: $name,num: $num"
}
# Output
# name: awww,num: 4
# name: bbv,num: 5
# name: ieunef,num: 2
# name: runf,num: 3
# name: xabsu,num: 1
但我希望使用更惯用的形式:
my %h = <xabsu ieunef runf awww bbv> Z=> 1..*; # create a hash with random key names
for %h.sort -> $name,$num {
say "name: $name,num: $num"
}
# Output
# name: awww 4,num: bbv 5
# name: ieunef 2,num: runf 3
# Too few positionals passed; expected 2 arguments but got 1
# in block <unit> at <unknown file> line 1
我敢肯定,有一种更巧妙的方法可以将“货币对”解压缩为for
语句的签名。
解决方法
更整洁的方式
for %h.sort -> (:key($name),:value($num)) {
这通过调用Pair
和.key
来破坏.value
的结构,然后分别将它们绑定到$name
和$num
。
也许是一个简短易懂的版本:
for %h.sort -> (:$key,:$value) {
这将创建与调用方法具有相同名称的变量。
,提出@Joshua 对答案的评论,更简洁的方法是:
%h.sort.map(|*.kv) -> $name,$num { ... }
这使用了两个 Raku 功能:
-
*
是地图中的任何星星来创建闭包 -
|
使结果列表变平,因此->
之后的$name,$num
变量不需要在括号内。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。