问题描述
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() {}
,值得一提的是,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);
}
与Result
类型相同:检查some_fn
是否返回Err
。