如何告诉编译器,我的函数像process::exit()一样终止程序?

6
我有一个包含错误恢复逻辑和最后 process::exit(0) 的函数:
fn gracefully_shutdown() {
    // Do some logic for the recover
    process::exit(7);
}

在错误情况下,我想调用那个函数,但match却抱怨不兼容的分支。 但是,当我显式地将它写入匹配分支时,它并不会抱怨,就像以下代码一样:

fn handle_result(my_result: Result<i32, MyError>) -> i32 {
    match my_result {
        Ok(val) => val,
        //Err(_error) => { process::exit(0); } // Does not complain
        Err(_error) => {
            gracefully_shutdown();
        } // Does complain
    }
}

编译器难以理解gracefully_shutdown()函数内部包含process::exit(0)吗?

我希望我的代码可以这样写:

fn handle_result(my_result: Result<i32, MyError>) -> i32 {
    match my_result {
        Ok(val) => val,
        Err(_error) => {
            gracefully_shutdown();
        }
    }
}

任何想法让它工作吗? 游乐场

这里回答了“为什么它不能推断”的问题:Rust中闭包和函数类型推断的差异 - trent
"gracefully_shutdown" - 这并不是真正的“优雅关闭”; 你的程序的其余部分从来没有机会进行清理。 - Shepmaster
@Shepmaster,是的,我知道,这是我以后要更改的代码。只是想知道编译器错误背后的主要原因。"Never type" 是我一直在寻找的关键答案。但是,如果您知道优雅关闭的好例子,我也很乐意研究这个话题 :) - Akiner Alkan
1个回答

9

1
请参阅为什么要使用分歧函数? - Shepmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接