在下面的代码中,我想要获取向量args中的第二个字符串,然后将其解析为i32.然而,这段代码不会编译,因为我不能对nth()返回的选项值调用parse().

use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();
    let a = args.iter().nth(1).parse::<i32>();
}

我知道在try 解析该值之前,我可以使用expect()来解开它,但是我不希望我的代码出现panic .我希望a是一个结果值,如果nth()parse()失败,则为Err,否则为OK(Int).有没有办法在Rust 的情况下做到这一点?谢谢.

推荐答案

如果您在文档中查找OptionResult,这是相当容易的.您正在考虑的函数可能是and_then,它允许您提供一个闭包,该闭包可以更改Ok的类型和值(如果填充),但在遇到错误时保持不变.但是,您需要确定要传播常见错误类型.由于Option<&String>需要转换为None值的错误,因此我们必须 Select 要使用的类型.

在这里,我提供了一个带有自定义错误类型的简短示例.我决定使用.get而不是.iter().nth(1),因为它的作用是一样的,既然您已经开始创建它,我们还不如利用Vec.

use std::num::ParseIntError;

enum ArgParseError {
    NotFound(usize),
    InvalidArg(ParseIntError),
}


let args: Vec<String> = env::args().collect();
let a: Result<i32, ArgParseError> = args
    .get(1)  // Option<&String>
    .ok_or_else(|| ArgParseError::NotFound(1))  // Result<&String, ArgParseError>
    .and_then(|x: &String| {
        x.parse::<i32>() // Result<i32, ParseIntError>
            .map_err(|e| ArgParseError::InvalidArg(e)) // Result<i32, ArgParseError>
    });

Rust相关问答推荐

为什么类型需要在这个代码中手动指定,在rust?

如何创建引用构造函数拥有的变量的对象?

如何装箱生命周期相关联的两个对象?

如何在Bevy/Rapier3D中获得碰撞机的计算质量?

从Type::new()调用函数

将PathBuf转换为字符串

try 创建随机数以常量

更合理的方法来设计样条线函数器?

使用关联类型重写时特征的实现冲突

失真图像图形捕获Api

在线程中运行时,TCPListener(服务器)在 ip 列表中的服务器实例之前没有从客户端接受所有客户端的请求

如何连接 Rust 中的相邻切片

Rust 将特性传递给依赖项

我如何将特征作为 struct 的拥有字段?

在 Rust 中返回对枚举变体的引用是个好主意吗?

匹配结果时的简洁日志(log)记录

`if let` 只是另一种编写其他 `if` 语句的方式吗?

如何在 Rust 的泛型函​​数中同时使用非拥有迭代器和消费迭代器?

为什么 u64::trailing_zeros() 在无分支工作时生成分支程序集?

在 macro_rules 中转义 $ 美元符号