如果存在一个
main
函数,(snip),则其返回类型必须是以下之一:
()
Result<(), E> where E: Error
但它没有说明当main()
返回()
、Ok(())
或Err(<value>)
时会发生什么。
就我测试的结果而言,
() |
Ok(()) |
Err(<value>) |
|
---|---|---|---|
退出状态 | 0 | 0 | 1 |
附加行为 | - | - | Error: <value> 被打印到stderr |
这些行为是否在某些文档中明确定义、详细说明或保证?特别是,我可以假设
当
main()
返回Err(<value>)
时,程序总是以1
状态退出吗?当
main()
返回Err(<value>)
时,显示的错误消息始终是Error: <value>
的形式吗?
注意事项:
我希望有一种文件化的保证,而不是经验性的解释。这就是为什么我添加了
#language-lawyer
标签。这个问题不是关于何时应该使用
()
和何时应该使用Result<(), E>
?等等。正如你所知道的,可以在许多文档或教程中找到这些问题的答案(或至少是提示或标准)。
更新:
Termination
特性在 Rust 1.61.0 中终于稳定下来了(source)。
Termination
这个 trait 在这里扮演着一个重要的角色。不幸的是,它也没有记录这种行为。我的猜测是,除了那些Termination for Result
的实现之外,它目前在任何地方都没有记录或保证。 - Lukas KalbertodtTermination
特性的RFC。 - rodrigolibc :: EXIT_SUCCESS
以表示成功执行。在失败的情况下,将返回libc :: EXIT_FAILURE
。”因此,这部分可能是可靠的(尽管不稳定的功能一样)。另一方面,错误打印似乎没有记录(虽然在“impl Termination for Result <...>”声明的“E:Debug”边界中暗示了)。 - JmbEXIT_SUCCESS
和EXIT_FAILURE
并未记录确切的输出),因此您不能假设其中任何一种情况,并且应该自己格式化输出并调用std::process::exit()
。当然,在实践中,行为极不可能改变,因为那将是一种不兼容的变化,但从语言专家的角度来看,您只是(尚)没有得到所要求的保证。 - user4815162342