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

时间:2019-02-08 12:59:25

标签: rust pattern-matching

我具有以下功能,其中包括一些错误恢复逻辑以及最后的process::exit(0)

fn gracefully_shutdown() {
    // Do some logic for the recover
    process::exit(7);
}

我想在错误情况下调用该函数,但是match抱怨incompatible arms。但是当我将其显式写入匹配臂时,它不会抱怨,如下所示:

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();
        }
    }
}

有什么主意可以做到这一点吗?

Playground

1 个答案:

答案 0 :(得分:7)

gracefully_shutdown的签名更改为

fn gracefully_shutdown() -> ! {
    process::exit(7);
}

这将告诉编译器该函数从不返回! !被称为never type

有关更多信息,请参见