用匹配结果读取 Rust 中的行

Posted

技术标签:

【中文标题】用匹配结果读取 Rust 中的行【英文标题】:Read lines in Rust with match result 【发布时间】:2022-01-15 20:45:37 【问题描述】:

我对 Rust 很陌生,并尝试实现一些基本的东西。 所以文档中的一个示例是关于从文本文件中读取行:https://doc.rust-lang.org/rust-by-example/std_misc/file/read_lines.html

示例代码有效(显然......)但我想修改它以添加一些错误处理但编译器抱怨我定义的结果

// the result after -> is not valid...
pub fn read_lines<P>(filename: P) -> std::result::Result<std::io::Lines<std::io::BufReader<std::fs::File>>, std::io::Error>
where P: AsRef<Path>, 
    let file = File::open(filename);
    let file = match file 
        Ok(file) => io::BufReader::new(file).lines(),
        Err(error) => panic!("Problem opening the file: :?", error),
    ;


// this is fine
pub fn read_lines2<P>(filename: P) -> io::Result<io::Lines<io::BufReader<File>>>
where P: AsRef<Path>, 
    let file = File::open(filename)?;
    Ok(io::BufReader::new(file).lines())

我尝试了智能感知的不同建议,但没有运气。

知道当有Ok/Err 时如何定义结果吗?

【问题讨论】:

【参考方案1】:

如果我正确理解您的代码的意图,这里有一个更规范的版本:

use std::fs::File;
use std::io::self, prelude::*;
use std::path::Path;

pub fn read_lines(filename: &Path) -> io::Lines<io::BufReader<File>> 
    let file = File::open(filename).expect("Problem opening the file");
    io::BufReader::new(file).lines()

如果您希望调用者处理任何错误,请返回类似io::Result&lt;T&gt;std::result::Result&lt;T, io::Error&gt; 的别名)的内容,表明可能出现故障。但是,如果您决定使用panic!()Result::expect() 之类的方法处理函数内部的错误,则无需将Result 返回给调用者,因为该函数仅在未发生错误时才返回给调用者。

【讨论】:

【参考方案2】:

这是你要找的吗?

pub fn read_lines<P>(filename: P) -> std::result::Result<std::io::Lines<std::io::BufReader<std::fs::File>>, std::io::Error>
where P: AsRef<Path>, 
    let file = File::open(filename);
    match file 
        Ok(file) => Ok(io::BufReader::new(file).lines()),
        Err(error) => panic!("Problem opening the file: :?", error),
    

我删除了 let file =; 以启用隐式返回,并在快乐路径周围添加了一个 Ok() 包装器。

【讨论】:

以上是关于用匹配结果读取 Rust 中的行的主要内容,如果未能解决你的问题,请参考以下文章

在python中实施多线程以读取文件中的行,并检查该行是否与给定的字符串匹配[closed]

Rust:从标准输入读取和映射行并处理不同的错误类型

从文件中读取索引“n”低于与给定正则表达式匹配的行的所有行

如何从 Fortran 模式匹配的行开始读取数据?

Rust 语言如何实现读取 yaml 配置文件

shell脚本读取配置文件参数