gpt4 book ai didi

rust - 在 Rust 中为什么需要类型注释,即使它们在通用特征中明确指定

转载 作者:行者123 更新时间:2023-11-29 08:28:38 24 4
gpt4 key购买 nike

如何编译这段代码:

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 trait 中编写 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的具体类型,它将提供实现的 AAA

关于rust - 在 Rust 中为什么需要类型注释,即使它们在通用特征中明确指定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57348872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com