以下是我的一些代码:

fn my_func(i: i32) -> Result<i32, String> {
    match i {
        42 => Ok(113),
        _ => Err("Can only use 42".to_string())
    }
}

fn main() {
    let myvec = [1, 2, 42];
    if myvec.iter().any(|i| my_func(*i).is_ok()) {
        println!("something was ok");
    } else {
        println!("nothing was ok");
    }
}

我想打印哪个元素是好的,而不是println!("something was ok");.

但是如果我赋值给一个any以内的变量,那么它在println!语句中是不可见的.

在本例中,所需的输出将为:

something was ok: 42

推荐答案

Iterator::any不能返回值.它只返回True或False.any返回值的变量称为Iterator::find_map.

将函数应用于iterator的元素,并返回第一个非NONE结果.

iter.find_map(f)等于iter.filter_map(f).next().

在"真"的情况下,Option<B>实际上只是一个带有额外信息的布尔值,所以我们将使用这些额外信息来返回一个有用的值.

let myvec = [1, 2, 42];
    if let Some(value) = myvec.iter().find_map(|i| my_func(*i).ok()) {
        println!("something was ok: {}", value);
    } else {
        println!("nothing was ok");
    }
}

Result::okResult并将其映射到Option.Ok变为Some,任何Err变为None(丢弃实际错误信息).

Rust相关问答推荐

Tauri tauri—apps/plugin—store + zustand

如何从铁 rust 中呼唤_mm_256_mul_ph?

通过使用光标拖动角来绕其中心旋转矩形

在Rust中,在实现特征`Display`时,如何获取调用方指定的格式?

有没有办法避免在While循环中多次borrow `*分支`

如何将像烫手山芋一样不透明的值从一个Enum构造函数移动到下一个构造函数?

Pin<;&;mut可能将Uninit<;T>;>;合并为Pin<;&;mut T>;

不能在一个代码分支中具有不变的自身borrow ,而在另一个代码分支中具有可变的self borrow

在铁 rust 中,如何一次只引用几件事中的一件?

为什么 vec![Vec::with_capacity(n)] 为子向量创建 0 容量?

为什么特征默认没有调整大小?

为什么我必须使用 PhantomData?在这种情况下它在做什么?

具有多个键的 HashMap

为什么编译器看不到这个 `From` impl?

Rust中的一生语法有什么作用?

decltype、dyn、impl traits,重构时如何声明函数的返回类型

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

为什么可以从闭包中返回私有 struct

在 Rust 中枚举字符串的最佳方式? (字符()与 as_bytes())

如何在 Rust 中使用特征标志来捕获多行代码?