是否有接受可能失败的谓词的 Iter::find() 等价物?

Is there an Iter::find() equivalent that accepts a predicate that may fail?

考虑这个函数:

pub async fn has_table(&mut self, name: &str) -> Result<bool, sqlx::Error> {
    for r in self
        .metadata
        .get_tables(&mut self.connection, name, &Vec::new(), None, None)
        .await?
    {
        if r.try_get::<'_, &'_ str, &'_ str>("name")? == name {
            return Ok(true);
        }
    }
    Ok(false)
}

我想用流畅的风格重写它的主体,但我不知道如何处理 r.try_get() 可能会失败的事实。理想情况下,我希望能够编写如下内容:

Ok(
    match self
        .metadata
        .get_tables(&mut self.connection, name, &Vec::new(), None, None)
        .await?
        .iter()
        .find(|r| r.try_get::<'_, &'_ str, &'_ str>("name")? == name)
    {
        Some(_) => true,
        None => false,
    },
)

这显然是无效的,因为 Iter::find() 的参数必须 return bool.

try_find 存在,但目前不稳定。

由于您已经有了基于 for 循环的实现,我认为在 try_find 稳定之前没有更简洁的方法来实现这一点。