首页 > 解决方案 > 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它将存储对原始数据的引用。或者,也许我只是完全误解了文档...¯_(ツ)_/¯

标签: rustownership

解决方案


这里的关键问题是您正在消费Vec. forRust 中的循环处理实现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
}

推荐阅读