【发布时间】:2019-06-03 05:34:37
【问题描述】:
我正在尝试使用此签名编写一个函数,而不使用 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 需要 T,而不是 &mut T。
我不想将mapVec 的签名更改为例如使用可变函数,如果可能的话,我希望它从外部看起来像一个纯函数,只是利用内部的变异,因为我们可以侥幸成功,因为调用者已将对象的所有权传递给我们。
【问题讨论】:
-
如何使用 into_iter 然后将结果收集到另一个 vec 中?
-
我已经编辑了问题,但不,我想避免新的分配,因为返回类型是相同的,我已经取得了所有权我想避免新的分配
-
请注意,
return x作为最后的声明不被视为良好的 rust 样式。见stackoverflow.com/q/27961879 -
为什么你认为它会做一个新的分配?编译器可以聪明地避免它。无论如何,我认为它不会花费一定的成本。
标签: rust