首页 文章

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

提问于
浏览
28

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

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

2 回答

  • -1

    Rust 1.0稳定

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

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

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

    替代(不推荐)解决方案

    您可以直接使用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 块 . 程序使用的资源将无法正确释放 . 这可能会导致悬挂插座等问题 . 据我所知,退出程序的正确方法是以某种方式终止所有线程,然后进程将自动退出 .

  • 36
    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
        }
    }
    

相关问题