首页 > 解决方案 > 在没有克隆的向量上映射

问题描述

我正在尝试使用此签名编写一个函数,而不使用clone()或分配新向量:

fn mapVec(f: Fn(T) -> T, x: Vec<T>) -> Vec<T>

在我看来,这似乎是可行的。对于 中的每个元素x,我们将其传递给f,并f获得它的所有权。然后我们产生一个返回值,然后在f取得这个传递值的所有权时,它会在必要时将其销毁。然后我们将返回值放回向量中。由于我们已经获得了 的所有权x,我们可以对其进行修改,然后我们可以将其返回给调用者。

我的尝试如下:

for e in x.iter_mut() {
    *e = f(e);
}
return x;

但不幸的是,f预计 a T,而不是 a &mut T

我不想将签名更改mapVec为例如,使用可变函数,如果可能的话,我希望它从外部看起来像一个纯函数,只是利用内部的变异,因为我们可以摆脱它,因为调用者已将对象的所有权传递给我们。

标签: rust

解决方案


您基本上遇到了replace_withand take_mutcrates 试图解决的问题。只需将其中一个板条箱的使用放入 for 循环即可解决您的问题。

请注意警告。如果地图回调发生恐慌,就会发生不好的事情。这是因为您要做的是将对象移出其位置,调用函数,然后将结果放回该位置。但是如果函数没有产生结果,即恐慌,你在空位置放什么?


推荐阅读