为什么Rust不使用默认的通用参数类型

时间:2019-09-06 15:10:00

标签: generics types rust

我想用默认类型创建通用结构。但是Rust编译器仍然需要我在创建结构时指定显式类型。

struct A {}

struct C<T = A> {
    t: Option<T>
}

fn main() {
    let c = C { t: None };
}

Rust编译器显示此错误:

error[E0282]: type annotations needed for `C<T>`
 --> src/main.rs:8:9
  |
8 | let c = C { t: None };
  |     -   ^ cannot infer type for `T`
  |     |
  |     consider giving `c` the explicit type `C<T>`, where the type parameter `T` is specified

如何允许我的代码用户省略通用参数?

1 个答案:

答案 0 :(得分:5)

当您不在变量绑定中精确定义类型时(赋值的左侧),编译器必须推断出它。

这里的值不够精确(None可以是任何值)。

一种解决方案是在绑定中声明类型。您不必为T指定类型,如果只写C,则将应用T的默认类型:

let c:C = C { t: None };

值得商

  • 是否是编译器错误(我不认为是,但是可以说人类在这里没有歧义)
  • 是否应该修复(我不认为这应该解决,因为在存在多个推理位置时,更复杂的情况可能模棱两可或难以解读)

请注意,在c:C中根本没有类型推断:省略<_><SomeType>意味着将应用默认类型。