在 Rust 中为什么需要类型注释,即使它们在通用特征中明确指定
In rust why are type annotations required even if they are explicitly specified in a generic trait
如何编译这段代码:
pub trait X<ApplyData> {
fn apply(data: &mut ApplyData);
}
pub trait AAA<ApplyData, Functions: X<ApplyData>> {
fn aaa(data: &mut ApplyData) {
//...default code that may use Functions...and call X::apply()
}
}
pub trait BBB<Data, Functions: X<Data>> {
fn bbb(data: &mut Data) {
AAA::<Data, Functions>::aaa(data); // I want to call the default aaa fn defined in the trait BBB
}
}
我收到以下错误:
error[E0283]: type annotations required: cannot resolve `_: AAA<Data, Functions>`
--> src/lib.rs:11:9
|
11 | AAA::<Data, Functions>::aaa(data);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: required by `AAA::aaa`
--> src/lib.rs:6:5
|
6 | fn aaa(data: &mut ApplyData);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
在 rustc 抱怨它无法推断函数类型之前,当我只在 BBB
特征中编写 AAA::aaa(data);
时,我认为这是有道理的。
现在我明确地给了编译器 Functions
但我得到的错误对我来说是神秘的。
AAA
是一个特征,但是当一个方法被调用时,Rust 需要有足够的信息来确定使用哪个类型的实现。在这种情况下,它需要知道在调用 aaa
.
时要使用 AAA
的哪个实现
但是,BBB
的签名中没有说明 使用 AAA
的哪个 实现。
很难知道您要做什么,但像这样的东西可以提供信息:
pub trait BBB<T, Data, Functions: X<Data>>
where
T: AAA<Data, Functions>
{
fn bbb(data: &mut Data) {
T::aaa(data);
}
}
这就是说,当 BBB
的实现者的具体类型已知时,我们也将知道 T
的具体类型,它将提供 [=11] 的实现=].
如何编译这段代码:
pub trait X<ApplyData> {
fn apply(data: &mut ApplyData);
}
pub trait AAA<ApplyData, Functions: X<ApplyData>> {
fn aaa(data: &mut ApplyData) {
//...default code that may use Functions...and call X::apply()
}
}
pub trait BBB<Data, Functions: X<Data>> {
fn bbb(data: &mut Data) {
AAA::<Data, Functions>::aaa(data); // I want to call the default aaa fn defined in the trait BBB
}
}
我收到以下错误:
error[E0283]: type annotations required: cannot resolve `_: AAA<Data, Functions>`
--> src/lib.rs:11:9
|
11 | AAA::<Data, Functions>::aaa(data);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: required by `AAA::aaa`
--> src/lib.rs:6:5
|
6 | fn aaa(data: &mut ApplyData);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
在 rustc 抱怨它无法推断函数类型之前,当我只在 BBB
特征中编写 AAA::aaa(data);
时,我认为这是有道理的。
现在我明确地给了编译器 Functions
但我得到的错误对我来说是神秘的。
AAA
是一个特征,但是当一个方法被调用时,Rust 需要有足够的信息来确定使用哪个类型的实现。在这种情况下,它需要知道在调用 aaa
.
AAA
的哪个实现
但是,BBB
的签名中没有说明 使用 AAA
的哪个 实现。
很难知道您要做什么,但像这样的东西可以提供信息:
pub trait BBB<T, Data, Functions: X<Data>>
where
T: AAA<Data, Functions>
{
fn bbb(data: &mut Data) {
T::aaa(data);
}
}
这就是说,当 BBB
的实现者的具体类型已知时,我们也将知道 T
的具体类型,它将提供 [=11] 的实现=].