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

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

推荐答案

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块.程序使用的资源将无法正确释放.这可能会导致一些问题,例如插座悬挂.

Rust相关问答推荐

为什么单元类型(空元组)实现了`Extend`trait?

把Vector3变成Vector4的绝妙方法

何时可以在Rust中退出异步操作?

为什么reqwest以文本形式下载二进制文件?

铁 rust 中的泛型:不能将`<;T作为添加>;::Output`除以`{Float}`

Rust&;Tokio:如何处理更多的信号,而不仅仅是SIGINT,即SIGQUE?

允许 rust 迹 struct 条目具有多种类型

为什么 tokio 在以奇怪的方式调用时只运行 n 个任务中的 n-1 个?

这个不安全的 Rust 代码有什么问题,所以它可以在 Windows 上运行,但不能在 Ubuntu 上运行?

需要哪些编译器优化来优化此递归调用?

相当于 Rust 中 C++ 的 std::istringstream

无法将`&Vec>`转换为`&[&str]`

使用在功能标志后面导入的类型,即使未启用功能标志

在构建器模式中捕获 &str 时如何使用生命周期?

为什么 i32 Box 类型可以在 Rust 中向下转换?

判断 is_ok 后重用结果

改变不实现克隆的 dioxus UseState struct

如何解析 Rust 中的 yaml 条件字段?

没有通用参数的通用返回

Rust HRTB 是相同的,但编译器说一种类型比另一种更通用