Types Rust无法推断没有注释的类型

Types Rust无法推断没有注释的类型,types,rust,Types,Rust,由于类型错误错误[E0283]:需要类型注释:无法解析uu3;:std::cmp::Eq,以下代码无法编译。编译此代码需要什么类型的注释 此示例代码取自一个更大的程序,其中使用MyHashGenerator::hash_node()对AST中的节点进行哈希运算(类型T与保存在AST节点内的值相关,但复制类型错误不需要AST的定义) 使用std::hash::hash; 发布特性哈希生成器{ fn散列(&self,msg:&str)->u64;//散列字符串。 fn hash_node(&self

由于类型错误
错误[E0283]:需要类型注释:无法解析uu3;:std::cmp::Eq
,以下代码无法编译。编译此代码需要什么类型的注释

此示例代码取自一个更大的程序,其中使用
MyHashGenerator::hash_node()
对AST中的节点进行哈希运算(类型
T
与保存在AST节点内的值相关,但复制类型错误不需要AST的定义)

使用std::hash::hash;
发布特性哈希生成器{
fn散列(&self,msg:&str)->u64;//散列字符串。
fn hash_node(&self)->u64;//哈希AST节点。
}
结构MyHashGenerator{}
MyHashGenerator的impl HashGenerator{
fn散列(&self,msg:&str)->u64{
0
}
fn散列\u节点(&self)->u64{
//错误[E0283]:需要类型批注:无法解析`\:std::cmp::Eq`
self.hash(“”)
}
}


这个问题类似于,但尚未得到回答

问题是
MyHashGenerator
不接受类型参数。因此,您承诺“相同类型的
MyHashGenerator
将足以作为哈希生成器,并且无论
T
,其行为方式都完全相同”
self.hash(“”
是对
HashGenerator
上的
hash
的调用,但Rust不一定知道调用的是
HashGenerator
实例。您可以通过以下两种方式之一明确此需求

选项1:显式类型参数

通过明确地告诉Rust参数是什么,可以避免这个问题

fn hash_node(&self) -> u64 {
    HashGenerator::<T>::hash(self, "")
}
然后,只要将实例声明为

impl<T: Clone + Eq + Hash + ToString> HashGenerator<T> for MyHashGenerator<T> {
    ...
}
MyHashGenerator的impl HashGenerator{ ... } 这样,您就不必更改
散列大小的实现


我个人建议选择1。它没有那么漂亮,但是它提供了额外的API保证,不管
T
,事情实际上都会以相同的方式工作。但是,如果您认为<代码> MyHashGenerator <代码>可能会使用<代码> t>代码>参数(或者如果它现在做了,而不是简单地包含在您的MCVE中),那么您可以考虑使用选项2使该依赖性更加清晰。

真。但是为
MyHashGenerator
实现
Eq
并不能修复错误。谢谢,这很有意义。我错过它的原因是,在原始代码中,
self.hash
传递了一个函数调用,该函数调用本身接受一个参数,该参数在
T
上参数化。我想这就是生活!
use std::marker::PhantomData

...

struct MyHashGenerator<T> {
    foo: PhantomData<T>
}
impl<T: Clone + Eq + Hash + ToString> HashGenerator<T> for MyHashGenerator<T> {
    ...
}