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
预计 a T
,而不是 a &mut T
。
我不想将签名更改mapVec
为例如,使用可变函数,如果可能的话,我希望它从外部看起来像一个纯函数,只是利用内部的变异,因为我们可以摆脱它,因为调用者已将对象的所有权传递给我们。
解决方案
您基本上遇到了replace_with
and take_mut
crates 试图解决的问题。只需将其中一个板条箱的使用放入 for 循环即可解决您的问题。
请注意警告。如果地图回调发生恐慌,就会发生不好的事情。这是因为您要做的是将对象移出其位置,调用函数,然后将结果放回该位置。但是如果函数没有产生结果,即恐慌,你在空位置放什么?
推荐阅读
- android - 将文件从 firebase 下载到 app 文件夹时是否需要请求运行时权限?
- vue.js - 如何使用 vue3.0 和 antd2.1.2 在页面加载时调用 vue.js 函数
- c# - C#从字节[]解密AES不完整的输入数据
- saleor - 在销售员的产品页面上添加更多字段
- javascript - 如何通过 SinonJs 模拟库?
- c++ - 函数为 std::String 返回空值
- python - 如何将普通函数与另一个将不同文本文件合并到一个文件中的函数结合起来?
- angular - Angular-如何在多个动态创建的 FormGroups 上使用 statusChanges?
- typescript - 如何用`n`不同的参数类型在Typescript中编写可变参数函数?
- javascript - 如何使用 redux-selectors 从我的数据中获取这些项目