用匹配结果读取 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<T>
(std::result::Result<T, io::Error>
的别名)的内容,表明可能出现故障。但是,如果您决定使用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 中的行的主要内容,如果未能解决你的问题,请参考以下文章