【发布时间】:2014-11-14 23:26:18
【问题描述】:
我正在使用 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 中字符串类型的生命周期。将instances 更改为Vec<Vec<String>> 也不能解决问题。
让我更加困惑的是,以下内容适用于单个字符串:
let x: Vec<&str> = some_string.as_slice().trim_chars('\n').split_str(",").collect();
我在这些值的生命周期中做错了什么导致此编译器错误?
如果迭代器适配器不是解决这个问题的惯用方法,请解释我为什么以及如何以不同的方式处理这个问题。
【问题讨论】:
-
如果你想读取 CSV 数据,那么你应该使用合适的解析器。 :) github.com/BurntSushi/rust-csv
-
@BurntSushi5:特别是因为在不考虑
"的情况下拆分,是个坏主意...
标签: rust