rust - Rust - 创建使用从迭代器存储的部分数据的 hashmap
问题描述
我是 rust 的新手,正在试图弄清楚如何HashMap
从数据中创建一个借来的值,Vec
但是当我尝试这样做时,我Vec
进入了一个HashMap
所有权模型与我作斗争。我不知道如何做到这一点,也许我只是在尝试一些违背 Rust 心态的东西。
例如:
struct Data{
id: String,
other_value: String,
}
//inside a method somewhere
let data_array = load_data(); // returns a Vec<Data>
let mut hash = HashMap::new(); // HashMap<&String, &Data>
for item in data_array {
hash.insert(&item.id, &item);
}
据我所知,应该有一种方法可以以这种方式填充这些数据,因为HashMap
它将存储对原始数据的引用。或者,也许我只是完全误解了文档...¯_(ツ)_/¯
解决方案
这里的关键问题是您正在消费Vec
. for
Rust 中的循环处理实现IntoIter
. IntoIter
将 Vec 移动到迭代器中 - 一旦完成, Vec 本身就不再存在。
因此,您正在循环的项目在每次迭代结束时都会消失,因此这些引用最终会引用不存在的数据(悬空引用)。如果您尝试使用它们,就会发生坏事。Rust 会阻止你像那样在脚上开枪,所以你会得到一个错误,告诉你引用的寿命不够长。使您的代码编译的解决方案非常简单。只需添加.iter()
到循环的末尾,它将遍历引用而不是消耗Vec
.
for item in data_array.iter() {
hash.insert(&item.id, item); //Note we don't need an `&` in front of item
}
推荐阅读
- html - 如何编辑 WordPress v4.9.5 页面的 html 代码
- caching - Elixir:Nebulex(缓存库)错误
- c++ - 无法将文件添加到 .zip 文件
- css - 在运行时更改 SASS 或 LESS 变量值
- vue.js - 我的 Vuetify Switch 没有改变他的值?
- python - pandas 函数返回多个值错误 - TypeError: unhashable type: 'list'
- php - 如何在视图中解释从数据库中获取的一些 html?
- json - 如何在 Eclipse 中进行 json 模式验证
- assembly - MIPS 分支指令的最大单次跳转范围是如何计算的?
- c# - 将属性自动映射到子属性的属性