You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:06:03