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

4ioopgfo  于 2022-11-30  发布在  其他
关注(0)|答案(6)|浏览(387)

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

fn main() {

}

但是这个函数不允许返回值。为什么一种语言不允许返回值?有办法返回一些东西吗?我能安全地使用C exit(int)函数吗?还是这会导致泄漏之类的问题?

yx2lnoni

yx2lnoni1#

reddit thread on this有一个“为什么”的解释:
铁 rust 当然可以被设计成这样。事实上,它曾经是这样的。
但是由于Rust使用的任务模型,fn主任务可能会启动一系列其他任务,然后退出!但是这些其他任务中的一个可能希望在main消失后设置OS退出代码。
调用set_exit_status是显式的、简单的,并且不需要总是在main的底部放置一个0。

agyaoht7

agyaoht72#

正如其他人所指出的那样,std::process::exit(code: i32)是这里要走的路
有关原因的更多信息,请参见RFC 1011: Process Exit。有关RFC的讨论,请参见the pull request of the RFC

bfhwhh0e

bfhwhh0e3#

试试看:

use std::process::ExitCode;

fn main() -> ExitCode {
  ExitCode::from(2)
}

Take a look in doc
或:

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)
}
vyu0f0g1

vyu0f0g14#

可以使用std::os::set_exit_status设置返回值。

wh6knrhe

wh6knrhe5#

从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>> {
   ...
}
iecba09b

iecba09b6#

std::process::exit(code: i32)是使用代码退出的方式。
Rust这样做是为了有一个一致的显式接口来从程序返回值,无论它是从哪里设置的。如果main启动了一系列任务,那么这些任务中的任何一个都可以设置返回值,即使main已经退出。
Rust确实有办法编写一个返回值的main函数,但它通常是在stdlib中抽象的。详细信息请参见the documentation on writing an executable without stdlib

相关问题