我正在尝试编写一个 Rust 箱,在使用Diesel创建简单的 CRUD 操作时,它会从用户那里删除一些样板代码
例如,如果您有Insertable一辆像这样的柴油机:
#[derive(Insertable)]
#[table_name = "users"]
pub struct UserCreate<'a> {
pub email: String,
pub hash: &'a [u8],
pub first_name: Option<String>,
pub family_name: Option<String>,
}
Run Code Online (Sandbox Code Playgroud)
我希望板条箱用户只需编写create<UserCreate>(model, pool), 将结构字段插入到数据库行中。
为此,我编写了以下函数签名(例如,简化的):
fn create<'a, C: 'a>(model: C, pool: DBPool)
where
C: diesel::Identifiable,
&'a C: diesel::Insertable<C::Table>,
{
let conn = pool.get().unwrap();
diesel::insert_into(C::table())
.values(&model)
.execute(&conn);
}
Run Code Online (Sandbox Code Playgroud)
问题是编译器抱怨 和Cat&C缺少一些特征边界.execute(&conn)缺少一些特征边界,我不太确定如何将它们放入子句中where,可能还有一种我不知道的更简单的方法。任何提示都非常受欢迎!
编译器输出:
error[E0277]: the trait bound `<<C as diesel::associations::HasTable>::Table as diesel::QuerySource>::FromClause: diesel::query_builder::QueryFragment<_>` …Run Code Online (Sandbox Code Playgroud) 我正在尝试利用当前不稳定的功能,generic_const_exprs让我的库的用户知道他们生成的类型的结果尺寸。
我的用例要复杂得多,但我创建了一个带有可重现错误的最小示例。主要思想是,给定 aTensor<N>作为输入,我想输出 a Tensor<M>,其中M是{N + 1}。A是一个特质,它同时为和 forTensor<N>实现。这是代码:Constant<N>Variable<M>
#![allow(incomplete_features)]
#![feature(generic_const_exprs)]
struct Variable<const N: usize>;
struct Constant<const N: usize>;
trait Tensor<const N: usize> {
fn get_dim(&self) -> usize {
N
}
}
trait ConvertTo<Y> {
fn convert(&self) -> Y;
}
impl<const N: usize> Tensor<N> for Variable<N> {}
impl<const N: usize> Tensor<N> for Constant<N> {}
impl<const N: usize, const M: usize> ConvertTo<Constant<M>> for Variable<N> {
fn convert(&self) -> Constant<M> …Run Code Online (Sandbox Code Playgroud)