目前我正在学习 Rust。我对模式匹配的错误处理有点困惑。这是我的代码
fn read_username() -> Result<String, io::Error> {
let files = File::open("hello.txt");
let file1 = match files {
Ok(f) => f,
Err(e) => Err(e) // why this is not valid
};
let file2 = match files {
Ok(f) => f,
Err(e) => return Err(e) // why this is valid
};
........
}
在 file1 中,我的代码有错误。但在 file2 中,我的代码运行良好。怎么可以这样?
Err(e)
不是 File
,因此您无法将其存储在 file1
中,但这就是您的第一个示例尝试执行的操作,第二个示例从函数返回,而不是尝试在 file2
中存储任何内容。
考虑在函数返回时在句柄或文件旁边获取唯一的文件句柄;即,您将收到一个 Result 类型(有两个可能的值:我们的句柄或错误)。之后,你就可以发展你的逻辑了。
看一下这个例子:
use std::fs::File;
use std::io::prelude::*;
use std::path::Path;
fn main() {
// Create a path to the desired file
let path = Path::new("hello.txt");
let display = path.display();
// Open the path in read-only mode, returns `io::Result<File>`
let mut file = match File::open(&path) {
Err(why) => panic!("couldn't open {}: {}", display, why),
Ok(file) => file,
};
// Read the file contents into a string, returns `io::Result<usize>`
let mut s = String::new();
match file.read_to_string(&mut s) {
Err(why) => panic!("couldn't read {}: {}", display, why),
Ok(_) => print!("{} contains:\n{}", display, s),
}
// `file` goes out of scope, and the "hello.txt" file gets closed
}
摘自书中:Rust by example