如何对 for 中的散列使用排序

Ric*_*rth 9 sorting hash raku

我有一个散列%h,我想for按键的字母顺序处理语句中的数据。

但是如果我sort在散列上使用 a ,我会得到一个Pairs的列表,这是可以理解的。但是我如何解压这个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

Run Code Online (Sandbox Code Playgroud)

但我更喜欢更惯用的形式:

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
Run Code Online (Sandbox Code Playgroud)

我确信有一种更简洁的方法可以将 Pair '解包'成for声明的签名。

Eli*_*sen 11

更整洁的方法:

for %h.sort -> (:key($name), :value($num)) {
Run Code Online (Sandbox Code Playgroud)

这Pair通过调用.key和.value来解构,然后将它们分别绑定到$name和$num。

也许是一个更短、更容易理解的版本:

for %h.sort -> (:$key, :$value) {
Run Code Online (Sandbox Code Playgroud)

这将创建与调用方法具有相同名称的变量。