我正在使用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();
我不知道如何在魯斯特的字符串類型的壽命都應該在此背景下使用。將instances
更改爲Vec<Vec<String>>
也不能解決問題。
什麼額外的困惑,我是在與一個String作品:
let x: Vec<&str> = some_string.as_slice().trim_chars('\n').split_str(",").collect();
我在做什麼不對這些值的壽命造成此編譯器錯誤?
如果迭代器適配器不是這種問題的慣用方法,請解釋爲什麼以及如何以不同的方式處理這個問題。
如果你想讀取CSV數據,那麼你應該使用正確的解析器。 :) https://github.com/BurntSushi/rust-csv – BurntSushi5 2014-11-15 10:46:26
@ BurntSushi5:特別是因爲分裂','沒有考慮到'''是一個壞主意...... – 2014-11-15 14:21:13