gpt4 book ai didi

hashmap - 为什么 csv::Reader 记录中的字符串在插入到 HashMap 中时生命周期不够长?

转载 作者:行者123 更新时间:2023-11-29 08:15:56 26 4
gpt4 key购买 nike

我对 Rust 的整个生命周期概念还很陌生。我正在尝试从 CSV 文件中读取一些数据并将它们放入 HashMap:

extern crate csv;

use std::collections::HashMap;

fn main() {
let files = vec!["file1.csv", "file2.csv", "file3.csv"];

let mut topics: HashMap<(&str, &str), &str> = HashMap::new();
for filename in files {
let mut rdr = csv::Reader::from_path(filename).unwrap();

for rec in rdr.records() {
let rr = rec.unwrap();
let value1 = rr.get(0).unwrap();
let value2 = rr.get(1).unwrap();
topics.insert((filename, value1), value2);
}
}
}

Playground link

但是出现如下错误:

error[E0597]: `rr` does not live long enough
--> src/main.rs:14:26
|
14 | let value1 = rr.get(0).unwrap();
| ^^ borrowed value does not live long enough
...
17 | }
| - `rr` dropped here while still borrowed
18 | }
19 | }
| - borrowed value needs to live until here

我认为插入 HashMap 会转移所有权,因此记录在循环外也可用。我在这里做错了什么?

最佳答案

看这段代码:

let mut topics: HashMap<(&str, &str), &str> = HashMap::new();
for filename in files {
let mut rdr = csv::Reader::from_path(filename).unwrap();

for rec in rdr.records() {
let rr = rec.unwrap();
let value1 = rr.get(0).unwrap();
let value2 = rr.get(1).unwrap();
topics.insert((filename, value1), value2);
}
}

它创建了一个包含对某些字符串的引用的HashMap,但这些字符串的所有者是什么?是rr;因此你的错误信息。

代码如下:

  1. Reader::from_path 从磁盘读取 CSV,rdr 拥有该结果。

  2. Reader::records 的文档说(强调我的):

    Returns a borrowed iterator over all records as strings.

    因此迭代器不能比 Reader 长寿。

  3. StringRecord::get的 API 是:

    pub fn get(&self, i: usize) -> Option<&str>

    这会返回一个字符串引用,它的生命周期与 self 一样长。

通过跟踪这一点,您尝试插入的字符串切片实际上引用了 StringRecord 拥有的数据。这些记录被丢弃在 for 循环主体的末尾,如错误消息中所示。允许您在循环后拥有这些引用会导致内存不安全,因此编译器会阻止您。

改为插入 String 允许代码继续:

topics.insert((filename, value1.to_owned()), value2.to_owned());

I thought insertion into the HashMap transfers ownership

是的,确实如此。 引用的所有权 已转移。这些引用文献所指的不是。

另见:

关于hashmap - 为什么 csv::Reader 记录中的字符串在插入到 HashMap 中时生命周期不够长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50419093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com