【问题标题】:Type annotation required even when provided即使提供了类型注释也需要
【发布时间】:2019-12-12 09:26:54
【问题描述】:

我想做这样的事情:

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 `&lt;_ as Trait&gt;::Type == _` (c.frust playground)

但即使我添加类型注释(Trait::function::&lt;Struct&gt;(&amp;val, 5u32)),我也有同样的错误。

有关此错误原因的任何线索?

【问题讨论】:

  • 你真的是说function 是通用的吗?似乎您希望 T 成为 Self
  • @mcarton 好吧,确实,谢谢!仍在学习 Rust 并且仍然有一些麻烦来做我想做的事。假设我来自 C++,这是一种完全不同的思维方式:D

标签: generics rust traits type-inference


【解决方案1】:

该特征没有提及selfSelf,但您似乎希望它以某种方式推断您想要的实例。

假设您有另一个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) {}
}

现在,它可以正确推断实例而无需额外的类型注释。

【讨论】:

  • 谢谢你,就像对 mcarton 的回答一样,我还在学习 Rust,但在做我想做的事情时仍然遇到一些麻烦。假设我来自 C++,这是一种完全不同的思维方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2018-12-21
  • 2018-09-07
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多