嵌套通用实现
Nested generic impl
我不明白为什么 Rust 不允许在其他泛型约束中使用泛型。
用普通话很难解释,但是例如这个简单的代码行不通
trait GenericTraitA<T1> {}
trait GenericTraitB<T2> {}
impl<T1, T2: GenericTraitA<T1>> dyn GenericTraitB<T2> {}
上面写着:
the type parameter T1
is not constrained by the impl trait, self
type, or predicates
但我不明白为什么这不受约束,我不明白这段代码中的歧义。
编译器错误的意思是,使用 impl 块定义,它无法确定合适的类型来替代 T1
。让我们看一个具体的例子来证明这一点:
pub trait Trait<T> {
fn foo(&self);
}
struct Bar;
impl Trait<u32> for Bar {
fn foo(&self) {
println!("u32 impl");
}
}
impl Trait<u64> for Bar {
fn foo(&self) {
println!("u64 impl");
}
}
impl<T, U> U
where
U: Trait<T>,
{
fn call_foo(&self) {
self.foo();
}
}
fn main() {
let bar = Bar;
bar.call_foo();
}
尝试编译此程序产生以下错误:
error[E0207]: the type parameter `T` is not constrained by the impl trait, self type, or predicates
--> src/main.rs:19:6
|
19 | impl<T, U> U
| ^ unconstrained type parameter
存在此错误的原因是,如果我们允许该 impl 块为 well-formed,bar.call_foo()
会出现不明确的行为。 Bar
实现了 Trait<u32>
和 Trait<u64>
,但是我们如何知道应该调用哪个版本的 foo
?答案是我们没有,这就是为什么这个程序不能编译。
我不明白为什么 Rust 不允许在其他泛型约束中使用泛型。
用普通话很难解释,但是例如这个简单的代码行不通
trait GenericTraitA<T1> {}
trait GenericTraitB<T2> {}
impl<T1, T2: GenericTraitA<T1>> dyn GenericTraitB<T2> {}
上面写着:
the type parameter
T1
is not constrained by the impl trait, self type, or predicates
但我不明白为什么这不受约束,我不明白这段代码中的歧义。
编译器错误的意思是,使用 impl 块定义,它无法确定合适的类型来替代 T1
。让我们看一个具体的例子来证明这一点:
pub trait Trait<T> {
fn foo(&self);
}
struct Bar;
impl Trait<u32> for Bar {
fn foo(&self) {
println!("u32 impl");
}
}
impl Trait<u64> for Bar {
fn foo(&self) {
println!("u64 impl");
}
}
impl<T, U> U
where
U: Trait<T>,
{
fn call_foo(&self) {
self.foo();
}
}
fn main() {
let bar = Bar;
bar.call_foo();
}
尝试编译此程序产生以下错误:
error[E0207]: the type parameter `T` is not constrained by the impl trait, self type, or predicates
--> src/main.rs:19:6
|
19 | impl<T, U> U
| ^ unconstrained type parameter
存在此错误的原因是,如果我们允许该 impl 块为 well-formed,bar.call_foo()
会出现不明确的行为。 Bar
实现了 Trait<u32>
和 Trait<u64>
,但是我们如何知道应该调用哪个版本的 foo
?答案是我们没有,这就是为什么这个程序不能编译。