rust - 映射到没有克隆的载体上

标签 rust

我正在尝试编写一个具有此签名的函数,而不使用 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 的签名例如,使用可变函数,如果可能的话,我希望它从外部看起来像一个纯函数,只需利用内部的突变,因为我们可以逃脱它,因为调用者已将对象的所有权传递给我们。

最佳答案

您实际上遇到了问题 replace_withtake_mut crates正在努力解决。只需将其中一个 crate 的使用放入 for 循环即可解决您的问题。

但请注意注意事项。如果 map 回调发生 panic ,就会发生不好的事情。这是因为您想要做的是将对象移出其位置,调用函数,然后将结果放回该位置。但是,如果该函数没有产生结果,即出现 panic ,那么您在空位置中放入什么?

关于rust - 映射到没有克隆的载体上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56421645/

相关文章:

types - 如何从usize中减去isize?

rust - 如何用 nightly Rust 解析 float ?

rust - 迭代循环包装索引的最佳方法是什么?

Rust,特征绑定(bind)选项未使用 process::Command 定义

rust - 如何在WASM-Bindgen和Rust中实际获取响应正文的文本

rust - 当我尝试在未确定大小的类型上手动实现 Ord 和 Eq 时,为什么会得到 `trait bound ` [T]: std::marker::Sized` is not satisfied?

floating-point - 如何指定 float 的舍入方式?

multithreading - 是否可以强制恢复休眠线程?

rust - 在包装函数中从结构中借用内部数据

c - 通过bindgen从Rust到C的指针: first element is always zero