为什么Rust在main函数中没有返回值,以及如何返回值呢?

时间:2014-06-16 13:47:10

标签: return main rust

在Rust中,main函数定义如下:

fn main() {

}

此功能不允许返回值。为什么一种语言不允许返回值,是否有办法返回一些东西?我是否能够安全地使用C exit(int)函数,或者这会导致泄漏等等吗?

5 个答案:

答案 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设置返回值。