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

Jer*_*oen 23 program-entry-point return rust

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

fn main() {

}
Run Code Online (Sandbox Code Playgroud)

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

tim*_*lyo 15

std::process::exit(code: i32) 是用代码退出的方法.


Rust以这种方式做到这一点,因此有一个一致的显式接口,用于从程序中返回一个值,无论它在何处设置.如果main启动一系列任务,则其中任何一个都可以设置返回值,即使main已退出.

Rust确实有一种编写main返回值的函数的方法,但它通常在stdlib中抽象.有关详细信息,请参阅有关编写不带stdlib的可执行文件的文档.

  • *即使 main 已经退出 * - 我的印象是当主线程退出时,整个程序都会退出。如何在程序不退出的情况下从 main 退出? (4认同)
  • 另请注意,这将立即退出进程,不会倒回堆栈,因此不会正常关闭。`Drop` 不会被调用。 (3认同)

0 0*_*0 0 14

Rust 1.26开始,main可以返回Result:

use std::fs::File;

fn main() -> Result<(), std::io::Error> {
    let f = File::open("bar.txt")?;

    Ok(())
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下返回的错误代码在发生错误时为1.与File::open("bar.txt").expect("file not found");代替,则返回(至少我的机器上)的101的误差值.

此外,如果要返回更一般的错误,请使用:

use std::error::Error;
...

fn main() -> Result<(), Box<dyn Error>> {
   ...
}
Run Code Online (Sandbox Code Playgroud)

  • @Lucretiel不是真的,因为它没有说为什么Rust没有main的返回值(默认情况下),并且这个解决方案没有告诉如何指定一个自己的返回值(后者可能会创建一个自己的错误) . (2认同)

Jac*_*nor 5

关于这个reddit 线程有一个“为什么”解释:

Rust 当然可以被设计来做到这一点。事实上,它曾经是。

但是由于 Rust 使用的任务模型,fn 主任务可以启动一堆其他任务然后退出!但是其他任务之一可能希望在 main 消失后设置操作系统退出代码。

调用 set_exit_status 是明确的、简单的,并且不需要你总是在 main 的底部放置一个 0,否则你不关心。

  • 从 C99 开始,“main”函数的行为就像在其末尾有一个“return 0;”语句,就像在 C++ 中一样。 (3认同)

Mel*_*lle 5

正如其他人所指出的,std::process::exit(code: i32)去这里的路是

有关原因的更多信息,请参见RFC 1011:流程出口。关于RFC的讨论在RFC 的请求中


Woj*_*tas 5

尝试:

use std::process::ExitCode;

fn main() -> ExitCode {
  ExitCode::from(2)
}
Run Code Online (Sandbox Code Playgroud)

看看文档

或者:

use std::process::{ExitCode, Termination};

pub enum LinuxExitCode { E_OK, E_ERR(u8) }

impl Termination for LinuxExitCode {
   fn report(self) -> ExitCode {
     match self {
       LinuxExitCode::E_OK => ExitCode::SUCCESS,
       LinuxExitCode::E_ERR(v) => ExitCode::from(v)
     }
   }
}

fn main() -> LinuxExitCode {
    LinuxExitCode::E_ERR(3)
}
Run Code Online (Sandbox Code Playgroud)