在任何§

请参阅 上下文中 的主要文档,了解方法 duckmap

method duckmap(&blockis rw is nodal

duckmap 将对以可应用 &block 的方式表现的每个元素应用 &block。如果失败,它将尽可能递归下降,否则将返回未经任何转换的项目。如果对象是 Associative,它将对值执行操作。

<a b c d e f g>.duckmap(-> $_ where <c d e>.any { .uc }).say;
# OUTPUT: «(a b C D E f g)␤» 
(('d''e'), 'f').duckmap(-> $_ where <e f>.any { .uc }).say;
# OUTPUT: «((d E) F)␤» 
{ first => ('d''e'), second => 'f'}.duckmap(-> $_ where <e f>.any { .uc }).say;
# OUTPUT: «{first => (d E), second => F}␤» 

在第一个案例中,它应用于 cde,它们满足应用该块({ .uc })的条件;其余部分按原样返回。

在第二个案例中,第一个项目是不满足条件的列表,因此对其进行访问;该扁平列表将以与第一个列表相同的方式表现。在这种情况下

say [[1,2,3],[[4,5],6,7]].duckmap*² ); # OUTPUT: «[9 9]␤»

只要表现得像数字,你就可以对任何东西求平方。在这种情况下,有两个数组,每个数组有 3 个元素;这些数组将转换为数字 3 并求平方。但在下一个案例中

say [[1,2,3],[[4,5],6.1,7.2]].duckmap-> Rat $_ { $_²} );
# OUTPUT: «[[1 2 3] [[4 5] 37.21 51.84]]␤»

3 项列表不是 Rat,因此它递归下降,但最终只将操作应用于那些像 Rat 一样行走(或爬行,视情况而定)的列表。

尽管从表面(和名称)上看,duckmap 可能看起来类似于 deepmap,但后者无论项目的类型如何都会递归应用。