Wait the light to fall

roundrobin

焉知非鱼

roundrobin 在中文里意味着 「设置轮流捡取」。 roundrobin 用于构建 list of lists.

say roundrobin <a b c>, <d e f>, <g h i>;
# OUTPUT: «((a d g) (b e h) (c f i))␤» 
 
say .join(",") for roundrobin([1, 2], [2, 3], [3, 4]);
# OUTPUT: «1,2,3␤ 
# 2,3,4␤» 

一旦输入列表中的一个或多个列表中的元素用光了, roundrobin 不会终止, 而是继续直到所有列表的所有元素用光为止。

say roundrobin <a b c>, <d e f m n o p>, <g h i j>;
# OUTPUT: «((a d g) (b e h) (c f i) (m j) (n) (o) (p))␤» 
 
say .join(",") for roundrobin([1, 2], [2, 3, 57, 77], [3, 4, 102]);
# OUTPUT: «1,2,3␤ 
# 2,3,4␤ 
# 57,102␤ 
# 77␤» 

因此在 ‘zipping’ 操作过程中不会丢失任何数据值。但是,不能从结果序列中收集到哪个输入列表提供的哪个元素的记录。

roundrobin 在将混乱的数据组合到可以进行手动的后处理步骤时非常有用。

roundrobin 有一个非常有意思的例子:

怎么把 N-1 个分隔符插入到 N 列中?

sub insert-separators-between-columns(@columns, @separators) {
    roundrobin( @columns, @separators ).flat.join()
}
> insert-separators-between-columns(<a b c>, <, |>)
a,b|c
> insert-separators-between-columns(<a b c d>, <, | ,>)
a,b|c,d