何时将数字文字分配给默认类型?

4

我在玩弄一些代码时,做出了以下观察:

let x = 1;
let () = x;

error: mismatched types [E0308]
note:  expected type `_`
note:     found type `()`

这显然行不通,但我期望的错误类型应该是i32而不是_。我发现对于未指定类型的浮点文字面量(例如1.0),情况也是如此。

为什么会这样呢?类型不应该已经作为默认值而知道吗?

更新:从Rust 1.12开始,错误信息更加详细:

expected integral variable, found ()

= note: expected type `{integer}`
= note:    found type `()`

我认为这个失败太明显了。类型检查器没有足够的进展来实际插入默认值,因为这根本不可能起作用。我只在错误消息中看到过默认值,当时它是一个严重的闭包和通用方法混乱的情况。 - oli_obk
1个回答

8
Rust不仅从初始化中进行类型推断,而且从每个用法中进行推断。因此,它的类型检查器必须查看变量的每个用法以决定它的类型,并且需要在推导和检查类型时进行推断。
这意味着let () = x;是同一过程的一部分。它是对x的使用,因此必须检查以查看x可能的具体类型。发现没有任何可能的类型能匹配()的事实是在编译器仍在尝试推断x的类型时发现的,因此还没有选择默认值,因为只有当编译器查看了所有x的用法并没有找到任何内容时才会使用默认值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接