作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个具有此签名的函数,而不使用 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_with
和 take_mut
crates正在努力解决。只需将其中一个 crate 的使用放入 for 循环即可解决您的问题。
但请注意注意事项。如果 map 回调发生 panic ,就会发生不好的事情。这是因为您想要做的是将对象移出其位置,调用函数,然后将结果放回该位置。但是,如果该函数没有产生结果,即出现 panic ,那么您在空位置中放入什么?
关于rust - 映射到没有克隆的载体上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56421645/
我是一名优秀的程序员,十分优秀!