函数内的泛型无法推导该怎么解决?
trait IDB {}
struct IMY{}
impl IDB for IMY{}
struct Pool1<DB:IDB>{
    _db:DB
}
trait Encode1<DB:IDB> {}
struct Query<DB:IDB>{
    _a:Pool1<DB>
}
trait SS<DB: IDB> {
    fn bind1<T: Encode1<DB> >(&self, _: T);
}
struct  BB{}
impl Encode1<IMY> for BB {}
struct  BB1{}
impl Encode1<IMY> for BB1 {}
impl <DB: IDB> SS<DB> for Query<DB> {
    fn bind1<T:Encode1<DB> >(&self, _: T)  {
        
    }
}
fn main() {    
    // let res =Query{_a:Pool1{_db:IMY{}}};
    // res.bind1(BB{});
    // res.bind1(BB1{});
    pub fn myexec<DB:IDB>(pool:Pool1<DB>)
    {
        let res =Query{_a:pool};
        res.bind1(BB{});
        res.bind1(BB1{});
    }
    myexec::<IMY>(Pool1{_db:IMY{}});
}
rror[E0277]: the trait bound `BB: Encode1<DB>` is not satisfied
  --> src\main.rs:36:19
   |
36 |         res.bind1(BB{});
   |             ----- ^^^^ the trait `Encode1<DB>` is not implemented for `BB`
   |             |
   |             required by a bound introduced by this call
   |
help: consider introducing a `where` bound, but there might be an alternative better way to express this requirement
   |
33 |     pub fn myexec<DB:IDB>(pool:Pool1<DB>) where BB: Encode1<DB>
   |                                           +++++++++++++++++++++
error[E0277]: the trait bound `BB1: Encode1<DB>` is not satisfied
  --> src\main.rs:37:19
   |
37 |         res.bind1(BB1{});
   |             ----- ^^^^^ the trait `Encode1<DB>` is not implemented for `BB1`
   |             |
   |             required by a bound introduced by this call
   |
help: consider introducing a `where` bound, but there might be an alternative better way to express this requirement
   |
33 |     pub fn myexec<DB:IDB>(pool:Pool1<DB>) where BB1: Encode1<DB>
   |                                           ++++++++++++++++++++++
    
	    
	    
		1
	    
	    
	    共 9 条评论, 1 页
	
	
    
评论区
写评论而且我打算把execute_by_pk 写出通用的函数。 如果别人依赖我的crate的话, 他新增的类型将得不到支持。 因为没包含进execute_by_pk的where之后。 感觉包装出来的函数就废了。
--
👇
Grobycn: 这问题原因是泛型约束不足,假设
bind(1)这里是i32,i32实现了Encode<_, MySql>, Encode<_, Postgres>等等一系列特性,但并不是通用的Encode<_, DB>。 泛型是无穷的,而实现是有限的。因此总有可能有一种类型MyDB,i32并没有实现Encode<_, MyDB>。 因此在where语句后面加上约束i32: Encode<_, DB>可以通过编译,当然还要约束一下生命周期。这样加约束的话会挺恐怖。等于要把所有的绑定的类型都在where后加一遍。
--
👇
Grobycn: 这问题原因是泛型约束不足,假设
bind(1)这里是i32,i32实现了Encode<_, MySql>, Encode<_, Postgres>等等一系列特性,但并不是通用的Encode<_, DB>。 泛型是无穷的,而实现是有限的。因此总有可能有一种类型MyDB,i32并没有实现Encode<_, MyDB>。 因此在where语句后面加上约束i32: Encode<_, DB>可以通过编译,当然还要约束一下生命周期。这问题原因是泛型约束不足,假设
bind(1)这里是i32,i32实现了Encode<_, MySql>, Encode<_, Postgres>等等一系列特性,但并不是通用的Encode<_, DB>。 泛型是无穷的,而实现是有限的。因此总有可能有一种类型MyDB,i32并没有实现Encode<_, MyDB>。 因此在where语句后面加上约束i32: Encode<_, DB>可以通过编译,当然还要约束一下生命周期。--
👇
php-lsys:
trait SS<DB: IDB> { fn bind1<T: Encode1>(&self, _: T); } 这个是外部crate定义的.我改不了. 谢谢大佬帮忙
--
👇
苦瓜小仔: 那就去修改函数定义啊,我又不知道你想干嘛。
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=57eb6f230b41a1313d20b180f538e2af
--
👇
php-lsys: 就是不能单一实现啊 能单一对泛型实现我就不用定义这个泛型了
--
👇
苦瓜小仔: 根据 fn bind1<T: Encode1> 的函数定义,你需要对 BB 和 BB1 实现泛型,即:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=7551857cfe7187665700ea2df79a9073
那就去修改函数定义啊,我又不知道你想干嘛。
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=57eb6f230b41a1313d20b180f538e2af
--
👇
php-lsys: 就是不能单一实现啊 能单一对泛型实现我就不用定义这个泛型了
--
👇
苦瓜小仔: 根据 fn bind1<T: Encode1> 的函数定义,你需要对 BB 和 BB1 实现泛型,即:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=7551857cfe7187665700ea2df79a9073
就是不能单一实现啊 能单一对泛型实现我就不用定义这个泛型了
--
👇
苦瓜小仔: 根据 fn bind1<T: Encode1> 的函数定义,你需要对 BB 和 BB1 实现泛型,即:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=7551857cfe7187665700ea2df79a9073
根据 fn bind1<T: Encode1> 的函数定义,你需要对 BB 和 BB1 实现泛型,即:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=7551857cfe7187665700ea2df79a9073