Rust中是否存在支持可失败谓词的Iter::find等效方法?
方案1:使用稳定版 Iterator::try_find(Rust 1.81+ 支持)
try_find是专门为「查找过程中可能产生错误」的场景设计的迭代器方法,它的谓词允许返回 Result<bool, E> 类型,执行逻辑如下:
- 谓词返回
Ok(true):终止遍历,返回Ok(Some(匹配项)) - 谓词返回
Ok(false):继续遍历 - 谓词返回
Err(e):终止遍历,透传错误Err(e) - 遍历结束无匹配:返回
Ok(None)
改写后代码:
pub async fn has_table(&mut self, name: &str) -> Result<bool, sqlx::Error> { let exists = self .metadata .get_tables(&mut self.connection, name, &Vec::new(), None, None) .await? .into_iter() .try_find(|r| Ok(r.try_get::<'_, &'_ str, &'_ str>("name")? == name))? .is_some(); Ok(exists) }
方案2:兼容旧版本Rust(使用稳定的try_fold实现)
如果你使用的Rust版本低于1.81,可以用长期稳定的try_fold模拟try_find的行为:
pub async fn has_table(&mut self, name: &str) -> Result<bool, sqlx::Error> { self .metadata .get_tables(&mut self.connection, name, &Vec::new(), None, None) .await? .into_iter() .try_fold(false, |_, r| { let matched = r.try_get::<'_, &'_ str, &'_ str>("name")? == name; if matched { // 找到匹配项时用特殊标记终止遍历 Err(matched) } else { Ok(false) } }) .or_else(|found| Ok(found)) }
内容的提问来源于stack exchange,提问作者Nicola Musatti
相关产品推荐
相关产品推荐

