如何从主函数外部提前退出Rust程序?

问题描述 投票:29回答:2

我正在Rust中编写一个bash克隆。当用户键入exit时,我需要退出程序。在我的程序的前几次迭代中,在添加更复杂的功能之前,我使用return退出提示用户输入的循环。这个逻辑现在是一个函数,因为我实现内置shell函数的方式,所以当我return它只是跳出函数回到控制循环,而不是短路控制循环和结束程序。

我意识到当用户键入exit并退出循环时我可能会返回一个布尔值,但我想至少知道Rust是否有办法提前终止程序,类似于Java的System.exit(),因为这对于某些类型的程式。

system rust
2个回答
42
投票

Rust 1.0 stable

std::process::exit()就是这样 - 它用指定的退出代码终止程序:

use std::process;

fn main() {
    for i in 0..10 {
        if i == 5 {
            process::exit(1);
        }
        println!("{}", i);
    }
}

此函数使程序立即终止,无需展开和运行析构函数,因此应谨慎使用。

Alternative (not recommended) solution

您可以直接使用C API。将libc = "0.2"添加到Cargo.toml,并且:

fn main() {
    for i in 0..10 {
        if i == 5 {
            unsafe { libc::exit(1); }
        }
        println!("{}", i);
    }
}

Rust编译器无法验证调用C函数,因此需要unsafe块。程序使用的资源将无法正确释放。这可能会导致悬挂插座等问题。据我所知,退出程序的正确方法是以某种方式终止所有线程,然后进程将自动退出。


-1
投票
panic!("Oh no something bad has happened!")

例:

    if a * g < 0f32 { panic!("The arithmetric-geometric mean is undefined for numbers less than zero!"); }

在较旧的文档中,您会看到它失败!(“哦,这里没有发生任何不好的事情。”)

由于某种原因,这个宏从失败变为恐慌。如果必须的话,恐慌是失败的方法。

[编辑]对不起。看起来你应该测试字符串“exit”的输入,这取决于你如何输入(按行或通过args)。然后,您可以在检测到退出的条件下使程序脱离循环。

例:

loop {
    if exit_found { break }
    else {
        // your thing, which also looks for exit_found
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.