我希望能够保留用于过滤表的谓词在一个地方的某个地方,并给它们起好的名字.例如:而不是写一些

let post = posts
    .filter(published.eq(true).and(id.eq(5))
    ...

我希望有一个这样的函数:

fn published_with_id(n: i64) -> (WHAT HERE?) {
    published.eq(true).and(id.eq(n))
}
...
let post = posts.filter(published_with_id(5))

然而,当我try 编译代码时,我得到了一个建议,即将谓词函数的返回类型声明为长的类型,并且确实有相当长的类型:diesel::expression::grouped::Grouped<diesel::expression::operators::And<diesel::expression::grouped::Grouped<diesel::expression::operators::Eq<columns::published, diesel::expression::bound::Bound<diesel::sql_types::Bool, bool>>>, diesel::expression::grouped::Grouped<diesel::expression::operators::Eq<columns::id, i64>>>>

有没有一种方法可以用一个合理的返回类型来注释它?或者有没有更好的方法把所有谓词都放在一个地方?

推荐答案

有一种方法可以指定函数返回实现trait的东西,而不需要命名具体类型.它被称为返回位置impl trait(RPIT),幸运的是,你有一个共同的trait,因为diesel::expression中定义的所有查询构建器组合器都实现了Expression. 因此,解决方案是使用impl Expression作为返回类型:

fn published_with_id(n: i64) -> impl Expression {
    published.eq(true).and(id.eq(n))
}

Rust相关问答推荐

为什么幻影数据不能自动推断?

如何将`Join_all``Vec<;Result<;Vec<;Foo&>;,Anywhere::Error&>;`合并到`Result<;Vec<;Foo&>;,Anywhere::Error&>;`

为什么Rust函数的移植速度比C++慢2倍?

如何在Tauri中将变量从后端传递到前端

如何从ruust中的fig.toml中读取?

如何将实现多个特征的 struct 传递给接受这些特征为&;mut?

处理带有panic 的 Err 时,匹配臂具有不兼容的类型

在 Rust 中,在需要引用 self 的 struct 体方法中使用闭包作为 while 循环条件

如何将带有嵌套borrow /NLL 的 Rust 代码提取到函数中

如何对一个特征的两个实现进行单元测试?

如何处理闭包中的生命周期以及作为参数和返回类型的闭包?

如何为已实现其他相关 std trait 的每个类型实现一个 std Trait

由特征键控的不同 struct 的集合

为什么数组不像向量那样在 for 块之后移动?

为什么会出现无法移出可变引用后面的 `self.x`错误?

为什么 &i32 可以与 Rust 中的 &&i32 进行比较?

将一片字节复制到一个大小不匹配的数组中

为什么分配对变量的引用使我无法返回它

为什么 `ref` 会导致此示例*取消引用*一个字段?

为什么 Bevy 的 Trait 边界不满足 Rapier 物理插件?