当我只关心一个变体而不是变体中的值时,匹配循环的惯用方式是什么?

问题描述

loop {
    match stream.write(&buffer) {
        Ok(_) => break,_ => {}
    }
}

是否有一种更易读惯用的方式编写它?我不需要在match内做任何事情,在Ok之后或Err之后不需要任何操作,因为只要缓冲区返回,它就会作为参考进行更新Ok

类似的东西:

while match some_fn() != Ok() {
    ...
}

解决方法

ForceBru's answer涵盖了一般情况,但是由于您拥有Result并且不关心Ok中的值,因此可以使用Result::is_ok(或Result::is_err):

while stream.write(&buffer).is_err() {}

rodrigo in the comments指出:

值得一提的是,Rust 1.42添加了matches!宏,因此您可以编写while matches!(stream.write(&buffer),Ok(_)) {},这对缺少is_*函数的其他枚举很有用。

,

您可以使用while let

fn some_fn(x: u32) -> Option<u32> {
    if x > 30 {
        Some(x)
    } else {
        None
    }
} 

fn main() {
    let mut x = 0;
    while let None = some_fn(x) {
        x += 1;
    }
    
    dbg!(x);
}

Playground

Result类型相同:检查some_fn是否返回Err