The duck in duckmap
指的是鸭子打字;也就是说,“如果它走起来像鸭子,说话也像鸭子,那么它一定是鸭子。”
> say [1,2.2,"3.4",4,"a"].duckmap(-> Str $_ { use fatal; .Int }).perl
[1, 2.2, 3, 4, "a"]
(use fatal
是否有这样的"a".Int
失败对象成为抛出的异常,因此duckmap
捕获它并返回原始数据)
这对于更改输入的一小部分非常有用,而无需专门处理每个可能的输入。
> say [1,2.2,"3.4",4,"a"].map(-> $_ { $_ ~~ Str ?? .Int // .self !! .self }).perl
[1, 2.2, 3, 4, "a"]
> say [1,2.2,"3.4",4,"a"].deepmap(-> $_ { $_ ~~ Str ?? .Int // .self !! .self }).perl
[1, 2.2, 3, 4, "a"]
之间还有更多差异duckmap
和另一个map
s,但它们都是为了这个基本前提。
> [ [<a b c>], [1,2,3], [[4,5,6],] ].duckmap(-> @_ where .all ~~ Int { @_.Str } ).perl
[["a", "b", "c"], "1 2 3", ["4 5 6"]]
> [ [<a b c>], [1,2,3], [[4,5,6],] ].map(-> @_ { @_.all ~~ Int ?? @_.Str !! @_.self } ).Array.perl
[["a", "b", "c"], "1 2 3", [[4, 5, 6],]] # doesn't match, as map is one level deep
(请注意,您根本无法执行上述操作deepmap
,因为它太深了)
为了获得相同的行为map
,可能需要更多的工作。