在 Perl 6 中使用带有数字的 .unique(:as ...)

Eug*_*sky 5 raku

文档中,解释了如何在调用之前规范化列表的元素.unique

可选的 :as 参数允许您在唯一化之前规范化/规范化元素。这些值被转换以进行比较,但它仍然是原始值进入结果列表。

并给出了以下示例:

say <a A B b c b C>.unique(:as(&lc))          # OUTPUT: «(a B c)?»
Run Code Online (Sandbox Code Playgroud)

如果我想让有理数列表唯一,只比较它们的整数部分怎么办?我应该如何Int在括号内调用方法:as

my @a = <1.1 1.7 4.2 3.1 4.7 3.2>;
say @a.unique(:as(?????))                # OUTPUT: «(1.1 4.2 3.1)?»
Run Code Online (Sandbox Code Playgroud)

UPD: 根据@Håkon 的回答,我找到了以下解决方案:

> say @a.unique(:as({$^a.Int}));
(1.1 4.2 3.1)
Run Code Online (Sandbox Code Playgroud)

或者

> say @a.unique(as => {$^a.Int});
(1.1 4.2 3.1)
Run Code Online (Sandbox Code Playgroud)

没有它可以做到$^a吗?

UPD2: 是的,它来了!

> say @a.unique(as => *.Int);
(1.1 4.2 3.1)
Run Code Online (Sandbox Code Playgroud)

或者

> say (3, -4, 7, -1, 1, 4, 2, -2, 0).unique(as => *²)
> (3 -4 7 -1 2 0)
Run Code Online (Sandbox Code Playgroud)

或者

> say @a.unique: :as(*.Int);
(1.1 4.2 3.1)
Run Code Online (Sandbox Code Playgroud)

Håk*_*and 3

一种方法是将匿名子例程传递给unique. 例如:

my @a = <1.1 1.7 4.2 3.1 4.7 3.2>;
say @a.unique(:as(sub ($val) {$val.Int})); 
Run Code Online (Sandbox Code Playgroud)

输出

(1.1 4.2 3.1)
Run Code Online (Sandbox Code Playgroud)