【问题标题】:Why Rust don't use default generic parameter type为什么 Rust 不使用默认的泛型参数类型
【发布时间】:2019-09-06 15:10:00
【问题描述】:

我想创建具有默认类型的通用结构。但是 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

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

【问题讨论】:

  • 如果你想构建一个struct 而不让用户为泛型类型而烦恼,你应该使用构建器模式。
  • 这里的编译器无法确定 T 的类型是默认类型,因为它试图从正确的部分推断类型。你可以用这个简单的提示来帮助它:` let c:C = C { t: None };`

标签: generics types rust


【解决方案1】:

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

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

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

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

值得商榷

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

请注意,在 c:C 中,根本没有类型推断:省略 &lt;_&gt;&lt;SomeType&gt; 表示应用默认类型。

【讨论】:

  • 我很确定这不是错误。在现实环境中(即实际使用c),这种情况不太可能发生。
  • @PeterHall 我也倾向于认为“修复”它会扰乱逻辑,也会让人类更难在不那么琐碎的情况下破译代码。
  • 谢谢!虽然 tt 仍然不清楚为什么编译器可以在左侧表达式中推断 T=A,但不能在右侧进行
猜你喜欢
  • 2016-11-14
  • 2019-09-18
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 2016-10-11
  • 1970-01-01
  • 2017-12-01
相关资源
最近更新 更多