如何在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 变量不需要在括号内。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...