我对 Rust 中模式匹配的错误处理有点困惑

问题描述 投票:0回答:2

目前我正在学习 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 中,我的代码运行良好。怎么可以这样?

rust error-handling pattern-matching
2个回答
0
投票

Err(e)
不是
File
,因此您无法将其存储在
file1
中,但这就是您的第一个示例尝试执行的操作,第二个示例从函数返回,而不是尝试在
file2
中存储任何内容。


0
投票

考虑在函数返回时在句柄或文件旁边获取唯一的文件句柄;即,您将收到一个 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

© www.soinside.com 2019 - 2024. All rights reserved.