函数内的泛型无法推导该怎么解决?
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