映射到无克隆的载体

Cli*_*ton 2 rust

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

fn mapVec(f: Fn(T) -> T, x: Vec<T>) -> Vec<T>
Run Code Online (Sandbox Code Playgroud)

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

我的尝试如下:

for e in x.iter_mut() {
    *e = f(e);
}
return x;
Run Code Online (Sandbox Code Playgroud)

但不幸的是f期望一个T,而不是一个&mut T

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

Seb*_*edl 5

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

请注意一些注意事项。如果地图回调出现紧急情况,则会发生不良情况。这是因为您要执行的操作是将对象移出其位置,调用一个函数,然后将结果放回该位置。但是,如果该函数没有产生结果(即出现紧急情况),那么您将在空白位置放置什么?


归档时间:

查看次数:

88 次

最近记录:

6 年,5 月 前