在Rust中,main函数定义如下:
fn main() {
}
此功能不允许返回值。为什么一种语言不允许返回值,是否有办法返回一些东西?我是否能够安全地使用C exit(int)
函数,或者这会导致泄漏等等吗?
答案 0 :(得分:12)
std::process::exit(code: i32)
是使用代码退出的方式。
Rust以这种方式做到这一点,因此有一个一致的显式接口,用于从程序中返回一个值,无论它在何处设置。如果main
启动了一系列任务,那么即使main
已退出,其中任何一项都可以设置返回值。
Rust确实有办法编写一个返回值的main
函数,但它通常在stdlib中抽象。有关详细信息,请参阅the documentation on writing an executable without stdlib。
答案 1 :(得分:10)
自Rust 1.26起,main
可以返回Result
:
use std::fs::File;
fn main() -> Result<(), std::io::Error> {
let f = File::open("bar.txt")?;
Ok(())
}
在出现错误的情况下,此情况下返回的错误代码为1。使用File::open("bar.txt").expect("file not found");
,将返回错误值101(至少在我的计算机上)。
此外,如果要返回更一般的错误,请使用:
use std::error::Error;
...
fn main() -> Result<(), Box<dyn Error>> {
...
}
答案 2 :(得分:4)
reddit thread on this有一个&#34;为什么&#34;说明:
Rust当然可以设计用来做到这一点。事实上它曾经是。
但是由于Rust使用的任务模型,fn主要任务可以启动一堆其他任务然后退出!但其中一个其他任务可能需要在main消失后设置OS退出代码。
调用set_exit_status是明确的,简单的,并且当您不关心时,并不要求您始终在主要的底部放置0。
答案 3 :(得分:4)
正如其他人所指出的那样,std::process::exit(code: i32)
是前往这里的方式
有关RFC 1011: Process Exit的原因的更多信息。关于RFC的讨论在the pull request of the RFC。
答案 4 :(得分:1)
您可以使用std::os::set_exit_status
设置返回值。