Rust 字符串生命周期和迭代器适配器(生命周期编译错误)

标签 rust

我正在使用 CSV,所以我需要修剪换行符并用逗号分隔每行,并过滤掉任何带有“?”的行在其中。

let instances: Vec<Vec<&str>> = file.lines()
    .map(|x| x.unwrap())
    .filter(|x| !(x.contains("?")))
    .map(|x| x.as_slice().trim_chars('\n').split_str(",").collect()).collect();

这是我收到的编译器错误消息:

.../src/main.rs:13:18: 13:19 error: `x` does not live long enough
.../src/main.rs:13         .map(|x| x.as_slice().trim_chars('\n').split_str(",").collect()).collect();
                                                             ^
.../src/main.rs:7:11: 21:2 note: reference must be valid for the block at 7:10...
.../src/main.rs:7 fn main() {
.../src/main.rs:8     let path = Path::new("./...");
.../src/main.rs:9     let mut file = BufferedReader::new(File::open(&path));
.../src/main.rs:10     let instances: Vec<Vec<&str>> = file.lines()
.../src/main.rs:11         .map(|x| x.unwrap())
.../src/main.rs:12         .filter(|x| !(x.contains("?")))
                                            ...
.../src/main.rs:13:18: 13:72 note: ...but borrowed value is only valid for the block at 13:17
.../src/main.rs:13         .map(|x| x.as_slice().trim_chars('\n').split_str(",").collect()).collect();

我不明白在这种情况下应该如何使用 Rust 中字符串类型的生命周期。改变 instancesVec<Vec<String>>也不能解决问题。

让我更加困惑的是,下面的内容只适用于单个字符串:

let x: Vec<&str> = some_string.as_slice().trim_chars('\n').split_str(",").collect();

我在这些值的生命周期上做错了什么导致了这个编译器错误?

如果迭代器适配器不是解决这个问题的惯用方法,请解释为什么以及我应该如何以不同的方式处理这个问题。

最佳答案

x &str是对 String 内容的引用,由 lines() 产生的那些. &str只能活到String它是一个引用,你没有存储 String任何地方。您需要将这些行存储在另一个变量中:

let lines = file.lines().map(|x| x.unwrap()).collect::<Vec<_>>();
let instances: Vec<Vec<&str>> = lines.iter()
    .filter(|x| !(x.contains("?")))
    .map(|x| x.trim_chars('\n').split_str(",").collect()).collect();

否则您将转换所有 &str进入String小号:

let instances: Vec<Vec<String>> = file.lines()
    .map(|x| x.unwrap())
    .filter(|x| !(x.contains("?")))
    .map(|x| x.trim_chars('\n').split_str(",")
        .map(|x| x.into_string()).collect()).collect();

作为附带说明,collect()电话可以写collect::<Vec<_>>() ,允许您从 instances 中删除类型注释多变的。哪个更好?由您决定。

关于Rust 字符串生命周期和迭代器适配器(生命周期编译错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26940504/

相关文章:

visual-studio-code - 使用vscode调试rust程序时出现错误(仅限windows)

rust - 如何在Rust中组合if-let语句?

rust - 如何在 Rust 中就地修改向量的元素?

rust - 将本地字符串作为切片返回 (&str)

rust - 如何有效地从控制台读取单行用户输入?

string - 如何在多个分隔符上拆分字符串(String 或 &str)?

rust - 如何将动态值传递到 WGPU 顶点着色器?

regex - 如何使用 Rust 正则表达式拆分字符串并保留分隔符?

android - 2021 年我应该如何为 Android 编译 Rust?

rust - 如何将异构类型放入 Rust 结构中