rust 如果让表达式在.iter().any中

5lhxktic  于 2023-03-08  发布在  其他
关注(0)|答案(2)|浏览(118)

下面是我的一些代码:

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");,而想打印哪个元素是OK。
但是如果我赋值给any中的一个变量,那么它在println!语句中就不可见了。
在这种情况下,所需输出为:

something was ok: 42
mjqavswn

mjqavswn1#

因为您需要没有出错的元素,所以使用Iterator::find

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

playground

y1aodyip

y1aodyip2#

Iterator::any不能返回值。它只返回true或false。any的变量Iterator::find_map * 不a返回值。
将函数应用于iterator的元素,并返回第一个非none结果。
iter.find_map(f)等于iter.filter_map(f).next()
Option<B>实际上只是一个布尔值,在“true”情况下包含额外信息,因此我们将使用这些额外信息返回一个有用的值。

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::ok获取Result并将其Map到OptionOk变为Some,并且任何Err变为None(实际错误信息被丢弃)。

相关问题