Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust &引用;借来的价值活得不够长。”;当逐行读取文件时_Rust - Fatal编程技术网

Rust &引用;借来的价值活得不够长。”;当逐行读取文件时

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

当我逐行阅读文件时,我对借阅有一些问题。 如何将借来的值(行_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(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