顺序循环和更改列表

Sequential Looping and changing list

我有一个二维结构列表,必须按顺序传递到一系列循环中。每个循环都会以影响后续循环输出的方式更改函数。所有元素必须完成第一个循环才能开始第二个循环。

目前,我有一个如下所示的系统:

self.list.iter().flatten().for_each(|e| { e.funcOne() });
self.list.iter().flatten().for_each(|e| { e.funcTwo() });
.....

虽然这确实有效,但并不优雅——它还需要重复展平 2d 列表。一种解决方案可能是将 self.list.iter().flatten() 存储到它自己的变量中,但是,这将需要在每次我想循环遍历它时克隆所述变量。

我的理想解决方案将包括语法上类似于此的内容:

self.list.iter().flatten().for_each(|e| e.funcOne()).for_each(|e| e.funcTwo()) ....... ;

Performance-wise 正如@Chayim Friedman 提到的那样,扁平化很好。 如果您看一下 flatten() source,它实际上并没有将二维数组转换为一维数组。它所做的是通过行迭代器懒惰地迭代一行,当行耗尽时,它切换到迭代下一行迭代器,依此类推,直到没有下一行。

如果您想要一个功能性(单行)解决方案,请考虑以下:

let functions = [
    ElemType::funcOne,
    ElemType::funcTwo,
];

functions.iter().for_each(|f| self.list.iter().flatten().for_each(f));