是否有接受可能失败的谓词的 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 稳定之前没有更简洁的方法来实现这一点。
考虑这个函数:
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 稳定之前没有更简洁的方法来实现这一点。