根据The Rust Reference

如果存在main函数(snip),其返回类型必须是以下类型之一:

  • 一百

  • 一百

但它没有说明当main()返回()Ok(())Err(<value>)时会发生什么.

据我测试,

() Ok(()) Err(<value>)
Exit Status 0 0 1
Additional Behavior - - Error: <value> is printed to stderr

这些行为是否在某些文档中定义、明确解释或保证?特别是,我可以假设

  • main()返回Err(<value>)时,程序总是以1状态退出?

  • main()返回Err(<value>)时显示的错误消息始终为Error: <value>


笔记:

  • 我想要某种书面的保证,而不是经验的解释.这就是我添加#language-lawyer标签的原因.

  • 这个问题不是关于When should I use 100 and when should I use 101?之类的.正如你所知,你可以在许多文档或教程中找到这些问题的答案(或者至少是提示或标准).

推荐答案

main中不同返回值的行为由std::process::Termination特征定义:

trait std::process::Termination

在主函数中实现任意返回类型的特性.

这种trait 被记录为成功时返回libc::EXIT_SUCCESS,错误时返回libc::EXIT_FAILURE.

默认实现返回libc::EXIT_SUCCESS表示执行成功.如果出现故障,则返回libc::EXIT_FAILURE.

但这些值是aren't guaranteed to be 0 and 1 on non-POSIX systems.


至于打印错误消息,Termination需要E: Debug,并且会将Debug impl打印到stderr,但我不相信它一定会保持完全相同.

impl<E: fmt::Debug> Termination for Result<!, E> {
    fn report(self) -> ExitCode {
        let Err(err) = self;
        eprintln!("Error: {:?}", err);
        ExitCode::FAILURE.report()
    }
}

Source

Rust相关问答推荐

预期 struct VecDeque Student发现 struct VecDeque Student(Student)

通用池类型xsx

在跨平台应用程序中使用std::OS::Linux和std::OS::Windows

如何定义实现同名但返回类型不同的 struct 的函数

我是否可以在Ruust中修改 struct 实例上的字符串,以使其在修改后具有相同的字符串生存期?

为什么`str`类型可以是任意大小(未知大小),而`string`类型的大小应该是已知的?

为什么我需要 to_string 函数的参考?

这个不安全的 Rust 代码有什么问题,所以它可以在 Windows 上运行,但不能在 Ubuntu 上运行?

Rust Axum 框架 - 解包安全吗?

如何处理闭包中的生命周期以及作为参数和返回类型的闭包?

枚举的利基优化如何在 Rust 中工作?

Rust 程序中的内存泄漏

为什么不可变特征的实现可以是可变的?

在线程中运行时,TCPListener(服务器)在 ip 列表中的服务器实例之前没有从客户端接受所有客户端的请求

类型判断模式匹配panic

是否可以在 Rust 中的特定字符上实现特征?

为什么会出现无法移出可变引用后面的 `self.x`错误?

Iterator::collect如何进行转换?

在 Rust 中获得准确时间的正确方法?

如何在 Rust 的泛型函​​数中同时使用非拥有迭代器和消费迭代器?