Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 在本文中,为什么即使在泛型特征中显式指定了类型注释,也需要类型注释_Rust_Traits_Type Inference_Generic Programming - Fatal编程技术网

Rust 在本文中,为什么即使在泛型特征中显式指定了类型注释,也需要类型注释

Rust 在本文中,为什么即使在泛型特征中显式指定了类型注释,也需要类型注释,rust,traits,type-inference,generic-programming,Rust,Traits,Type Inference,Generic Programming,如何编译此代码: pub-trait X{ fn应用(数据:&mut ApplyData); } 酒吧特质AAA{ fn aaa(数据:&mut ApplyData){ //…可以使用函数…并调用X::apply()的默认代码 } } 酒吧特色BBB{ fn bbb(数据:&mut数据){ AAA:::AAA(数据);//我想调用trait BBB中定义的默认AAA fn } } 我得到以下错误: error[E0283]:需要类型批注:无法解析`\:AAA` -->src/lib.rs:11

如何编译此代码:

pub-trait X{
fn应用(数据:&mut ApplyData);
}
酒吧特质AAA{
fn aaa(数据:&mut ApplyData){
//…可以使用函数…并调用X::apply()的默认代码
}
}
酒吧特色BBB{
fn bbb(数据:&mut数据){
AAA:::AAA(数据);//我想调用trait BBB中定义的默认AAA fn
}
}
我得到以下错误:

error[E0283]:需要类型批注:无法解析`\:AAA`
-->src/lib.rs:11:9
|
11 | AAA:::AAA(数据);
|         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
注:“AAA::AAA”要求`
-->src/lib.rs:6:5
|
6 | fn aaa(数据:&mut ApplyData);
|     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
在rustc抱怨之前,当我只编写
AAA::AAA(数据)时,它无法推断函数的类型
BBB
特质中,我认为这是有意义的。
现在我显式地给了编译器
函数
,但是我得到的错误对我来说是神秘的。

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
{
fn bbb(数据:&mut数据){
T::aaa(数据);
}
}

这就是说,当
BBB
的具体实现者类型已知时,我们也将知道
T
的具体类型,它将提供
AAA

的实现,您在这里尝试做什么还不清楚。代码没有多大意义。我强烈怀疑您需要在方法签名中包含
self
&self
&mut self
。或者,
data
应该是
self
?我不想包括self。这只是一个有趣的理论例子。假设我是一个极端分子,不想使用点表示法,保持函数和数据之间贫乏的区别。你能试着在这些奇怪的约束下找到一个解决方案吗?也许我尝试的是不可能的我不确定我刚刚意识到了这一点,所以我稍微修改了我的问题。如果trait中有一个默认的方法实现呢。我还能参考一下吗?不创造一个struct@J.M.不。Rust仍然需要知道哪种具体类型——以防具体类型有自己的实现而不是默认实现。Rust中有没有办法明确地说,我想在trait定义中使用默认实现,而不是任何具体实现?有没有办法使默认实现成为“最终的”?我想我不再需要特性了,我可以使用常规的function@J.M.确切地说,如果您知道要调用哪个函数,那么就调用它。在这种情况下,特质有什么用?