如何在 raku 中对散列进行排序

要在 Raku 中对散列进行排序,首先你要知道什么是占位符变量。一旦这个概念变得清晰,对散列排序就变得非常简单。

例如,创建一个不同城市距离莫斯科远近的散列:

my %distance =
    Владимир    => 185,
    Волгоград   => 1000,
    Калининград => 1227,
    Мурманск    => 1895,
    Новосибирск => 3550;

现在的任务是通过比较距离来对散列进行排序。

say %distance.sort({$^a.value <=> $^b.value});

一般来说,它已经准备好了。该程序打印你需要的东西:

(Владимир => 185 Волгоград => 1000 Калининград => 1227 Архангельск => 1261 Астрахань => 1411 Мурманск => 1895 Новосибирск => 3550)

让我们看看传递给排序方法的块内发生了什么。

首先,变量 $^a$^b 是占位符,它是匿名块的参数并按字母顺序排序。也就是说,以相同的方式,他们可以被称为 $^x$^y$^var1$^var2

其次,这些占位符变量内部是 Pair 类型的对象,它包含键和值:

say %distance.sort({
    say $^a.key ~ ', ' ~ $^a.value ~ ' vs. ' ~
        $^b.key ~ ', ' ~ $^b.value;
    $^a.value <=> $^b.value
});

通过这种方式,我们可以看到哪些 pair 对儿接收到排序方法:

Владимир, 185 vs. Новосибирск, 3550
Калининград, 1227 vs. Волгоград, 1000
Мурманск, 1895 vs. Астрахань, 1411
Владимир, 185 vs. Волгоград, 1000
Новосибирск, 3550 vs. Волгоград, 1000
Новосибирск, 3550 vs. Калининград, 1227
Астрахань, 1411 vs. Архангельск, 1261
Владимир, 185 vs. Архангельск, 1261
Волгоград, 1000 vs. Архангельск, 1261
Калининград, 1227 vs. Архангельск, 1261
Новосибирск, 3550 vs. Архангельск, 1261
Новосибирск, 3550 vs. Астрахань, 1411
Новосибирск, 3550 vs. Мурманск, 1895

如果您不想使用占位符,则可以显式声明匿名块的参数并在排序时使用它们:

say %distance.sort( -> $город1, $город2 {
    $город1.value <=> $город2.value
});