如何用退出代码干净地结束程序?

Tho*_*att 31 rust

有没有办法在Rust 1.0中返回退出代码?

我试过env::set_exit_status(exit_code);但这会产生编译器错误.

还有这个问题:提前退出Rust程序,这是类似的,但询问过程必须提前退出的情况.


编辑:我正在寻找一个解决方案,也可以让进程整理堆栈,调用析构函数等.

Lev*_*ans 43

根据@FrancisGagné的回答评论,如果你正在寻找相当于C的return exit_code,你可以通过这种方式人为地构建它:

fn main() {
    let exit_code = real_main();
    std::process::exit(exit_code);
}

fn real_main() -> i32 {
    // the real program here
}
Run Code Online (Sandbox Code Playgroud)

这样,程序的所有对象都将在real_main()函数的范围内,并且您可以安全地使用return exit_code;,main同时仍然可以正确运行所有析构函数.

使用它会更合适std::env::set_exit_status(..),但是这个功能还没有稳定的Rust.


Fra*_*gné 11

std::process::exit 使用指定的退出代码退出程序.

  • 不幸的是它没有清理并调用析构函数.我会修改这个问题. (4认同)
  • 我想我正在寻找 C 中 `return exit_code;` 的直接替代品。如果可能的话,我想避免不刷新到磁盘等的可能性。 (2认同)

Fra*_*gné 6

从Rust 1.26开始,该main函数不再限于()main还可Result<(), E>以为任何type 返回a E: Debug。的Ok值映射到EXIT_SUCCESS(这恰好是0在所有平台上)和一个Err值映射为EXIT_FAILURE(这恰好是1在所有平台上)。错误值也会自动打印到标准错误流中。

将来,Rust将支持的更多返回类型main。的Termination性状(如不稳定锈病1.31.1的)定义了所有这些类型的。特质的工作是将值转换为i32退出代码。当Termination变得稳定时,应用程序自然可以自己实现该特征以提供自己的结果类型。