我是 Rust 新手,正在尝试弄清楚如何从数据的 Vec
中创建借用值的 HashMap
,但是当我尝试这样做时,我发现将 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
。 Rust 中的 for
循环作用于实现 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
}
关于Rust - 创建 HashMap ,它使用它从迭代器存储的部分数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61001744/