即使提供也需要类型注释
Type annotation required even when provided
我想做这样的事情:
trait Trait {
type Type;
fn function<T>(val1: &T, ty: T::Type)
where T: Trait
{}
}
struct Struct;
impl Trait for Struct {
type Type = u32;
}
fn main() {
let val = Struct;
Trait::function(&val, 5u32);
}
我得到了错误:error[E0284]: type annotations required: cannot resolve `<_ as Trait>::Type == _`
(c.f rust playground)
但是即使我添加类型注释(Trait::function::<Struct>(&val, 5u32)
),我也有同样的错误。
关于这个错误的原因有什么线索吗?
特征没有提到 self
或 Self
,但您似乎希望它以某种方式推断出您想要的实例。
假设您有另一个 Trait
的实现:
struct Struct2;
impl Trait for Struct2 {
type Type = u32;
}
然后,即使您将 Struct
引用作为第一个参数传递,它对任一实现都有意义。这没关系:
let val = Struct;
<Struct as Trait>::function(&val, 5u32);
没关系:
let val = Struct;
<Struct2 as Trait>::function(&val, 5u32);
如果您希望通过传递给 function
的类型来确定实例,则参数类型应为 Self
而不是 T
:
trait Trait {
type Type;
fn function(&self, ty: Self::Type) {}
}
现在,它无需额外的类型注释即可正确推断实例。
我想做这样的事情:
trait Trait {
type Type;
fn function<T>(val1: &T, ty: T::Type)
where T: Trait
{}
}
struct Struct;
impl Trait for Struct {
type Type = u32;
}
fn main() {
let val = Struct;
Trait::function(&val, 5u32);
}
我得到了错误:error[E0284]: type annotations required: cannot resolve `<_ as Trait>::Type == _`
(c.f rust playground)
但是即使我添加类型注释(Trait::function::<Struct>(&val, 5u32)
),我也有同样的错误。
关于这个错误的原因有什么线索吗?
特征没有提到 self
或 Self
,但您似乎希望它以某种方式推断出您想要的实例。
假设您有另一个 Trait
的实现:
struct Struct2;
impl Trait for Struct2 {
type Type = u32;
}
然后,即使您将 Struct
引用作为第一个参数传递,它对任一实现都有意义。这没关系:
let val = Struct;
<Struct as Trait>::function(&val, 5u32);
没关系:
let val = Struct;
<Struct2 as Trait>::function(&val, 5u32);
如果您希望通过传递给 function
的类型来确定实例,则参数类型应为 Self
而不是 T
:
trait Trait {
type Type;
fn function(&self, ty: Self::Type) {}
}
现在,它无需额外的类型注释即可正确推断实例。