Rust - 创建 HashMap ,它使用它从迭代器存储的部分数据

标签 rust ownership

我是 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/

相关文章:

pointers - 如何强制 Rust 获得非安全方法分配的内存的所有权?

rust - 在Rust中对 “caching proxy”拥有适当的所有权?

rust - 解决通过引用获取参数的闭包的类型不匹配

struct - println 中的可变和不可变引用

rust - 为什么 Rust 需要 `if let` 语法?

c# - 防止并发访问被传递的对象

rust - 调用函数返回但未分配的值的所有权会发生什么情况?

rust - 如何使用嵌入式 HAL 在 Rust 中配置 UART?

validation - 如何验证结构创建?

rust - 将 &[&str] 移动到线程中