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

Mic*_*yin 5 generics types rust

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

struct A {}

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

fn main() {
    let c = C { t: None };
}
Run Code Online (Sandbox Code Playgroud)

Rust编译器显示此错误:

struct A {}

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

fn main() {
    let c = C { t: None };
}
Run Code Online (Sandbox Code Playgroud)

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

Den*_*ret 5

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

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

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

let c:C = C { t: None };
Run Code Online (Sandbox Code Playgroud)

值得商bat

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

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