在Rust中,主函数定义如下:
fn main() { }
但是这个函数不允许返回值。为什么一种语言不允许返回值?有办法返回一些东西吗?我能安全地使用C exit(int)函数吗?还是这会导致泄漏之类的问题?
exit(int)
yx2lnoni1#
reddit thread on this有一个“为什么”的解释:铁 rust 当然可以被设计成这样。事实上,它曾经是这样的。但是由于Rust使用的任务模型,fn主任务可能会启动一系列其他任务,然后退出!但是这些其他任务中的一个可能希望在main消失后设置OS退出代码。调用set_exit_status是显式的、简单的,并且不需要总是在main的底部放置一个0。
agyaoht72#
正如其他人所指出的那样,std::process::exit(code: i32)是这里要走的路有关原因的更多信息,请参见RFC 1011: Process Exit。有关RFC的讨论,请参见the pull request of the RFC。
std::process::exit(code: i32)
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) }
vyu0f0g14#
可以使用std::os::set_exit_status设置返回值。
std::os::set_exit_status
wh6knrhe5#
从Rust 1.26开始,main可以返回Result:
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(至少在我的机器上是这样)。此外,如果要返回更一般的错误,请用途:
File::open("bar.txt").expect("file not found");
use std::error::Error; ... fn main() -> Result<(), Box<dyn Error>> { ... }
iecba09b6#
std::process::exit(code: i32)是使用代码退出的方式。Rust这样做是为了有一个一致的显式接口来从程序返回值,无论它是从哪里设置的。如果main启动了一系列任务,那么这些任务中的任何一个都可以设置返回值,即使main已经退出。Rust确实有办法编写一个返回值的main函数,但它通常是在stdlib中抽象的。详细信息请参见the documentation on writing an executable without stdlib。
6条答案
按热度按时间yx2lnoni1#
reddit thread on this有一个“为什么”的解释:
铁 rust 当然可以被设计成这样。事实上,它曾经是这样的。
但是由于Rust使用的任务模型,fn主任务可能会启动一系列其他任务,然后退出!但是这些其他任务中的一个可能希望在main消失后设置OS退出代码。
调用set_exit_status是显式的、简单的,并且不需要总是在main的底部放置一个0。
agyaoht72#
正如其他人所指出的那样,
std::process::exit(code: i32)
是这里要走的路有关原因的更多信息,请参见RFC 1011: Process Exit。有关RFC的讨论,请参见the pull request of the RFC。
bfhwhh0e3#
试试看:
Take a look in doc
或:
vyu0f0g14#
可以使用
std::os::set_exit_status
设置返回值。wh6knrhe5#
从Rust 1.26开始,
main
可以返回Result
:在这种情况下,如果出现错误,返回的错误代码是1。如果使用
File::open("bar.txt").expect("file not found");
,则返回的错误值是101(至少在我的机器上是这样)。此外,如果要返回更一般的错误,请用途:
iecba09b6#
std::process::exit(code: i32)
是使用代码退出的方式。Rust这样做是为了有一个一致的显式接口来从程序返回值,无论它是从哪里设置的。如果
main
启动了一系列任务,那么这些任务中的任何一个都可以设置返回值,即使main
已经退出。Rust确实有办法编写一个返回值的
main
函数,但它通常是在stdlib中抽象的。详细信息请参见the documentation on writing an executable without stdlib。