Rust &引用;借来的价值活得不够长。”;当逐行读取文件时
当我逐行阅读文件时,我对借阅有一些问题。 如何将借来的值(行_ok)转换为代码中的自有值 运行以下代码时:Rust &引用;借来的价值活得不够长。”;当逐行读取文件时,rust,Rust,当我逐行阅读文件时,我对借阅有一些问题。 如何将借来的值(行_ok)转换为代码中的自有值 运行以下代码时: use std::fs::{File}; use std::io::{BufRead, BufReader,Lines,Error}; fn read_lines(filename: &str) -> Result<Lines<BufReader<File>>, Error>{ let file = File::open(file
use std::fs::{File};
use std::io::{BufRead, BufReader,Lines,Error};
fn read_lines(filename: &str) -> Result<Lines<BufReader<File>>, Error>{
let file = File::open(filename)?;
Ok(BufReader::new(file).lines())
}
fn main() {
let values1=vec!["a","asd"];
let values2=vec!["b","csd"];
let file_path="file.txt";
if let Ok(reader)=read_lines(file_path){
let mut previous : Option<&str>= None;
for line in reader {//["a","ab","b","cb","asd","csd"]
if let Ok(line_ok)=line{
if values1.contains(&line_ok.as_str()){
previous=Some(&line_ok);
}
else if values2.contains(&line_ok.as_str()){
if previous.is_some(){
println!("{} is {}",previous.unwrap(),line_ok);
}
previous=None;
}
}
}
}
}
是io::Result
的迭代器。您不能存储对此迭代器生成的字符串的引用,因为它将在下一次迭代中超出范围。您可以将previous
的类型更改为选项
,以使其正常工作
使用std::fs::File;
使用std::io::{BufRead,BufReader,Error,Lines};
fn读取\u行(文件名:&str)->结果{
让文件=文件::打开(文件名)?;
确定(BufReader::new(file.lines())
}
fn main(){
设值1=vec![“a”,“asd”];
设值2=vec![“b”,“csd”];
让file_path=“file.txt”;
如果让Ok(读卡器)=读取行(文件路径){
让mut-previous:Option=None;
在线阅读器{
//[“a”、“ab”、“b”、“cb”、“asd”、“csd”]
如果让Ok(line_Ok)=line{
如果值1.contains(&line\u ok.as\u str()){
previous=部分(行_ok);
}如果values2.contains(&line\u ok.as\u str()){
如果让一些(上一个)=上一个{
println!(“{}是{}”,上一行,行_ok);
}
先前=无;
}
}
}
}
}
作为旁白:您可以使用io::Result
作为Result
的速记。从read_lines
,impl Iterator
返回一个通用返回类型也是一个好主意,这样签名就不会违背您实现迭代器的策略。将两者结合起来,其签名将是fn read_行(filename:&str)->io::Result
。实现可以保持不变。如果让some(p)=previous{println!(“{}是{}”,p,line_ok);}@Jmb您是对的,则最好使用。。更新
error[E0597]: `line_ok` does not live long enough
--> src\main.rs:19:35
|
19 | previous=Some(&line_ok);
| ^^^^^^^^ borrowed value does not live long enough
...
22 | if previous.is_some(){
| -------- borrow later used here
...
27 | }
| - `line_ok` dropped here while still borrowed