I was playing around with some code and made the following observation:
let x = 1;
let () = x;
error: mismatched types [E0308]
note: expected type `_`
note: found type `()`
This obviously fails, but I was expecting the error to state that the expected type was i32
, not _
. I found out that the same happens with a floating literal of an unspecified type, e.g. 1.0
.
Why is it so? Shouldn't the type already be known as the default?
Update: as of Rust 1.12, the error message is more informative:
expected integral variable, found ()
= note: expected type `{integer}`
= note: found type `()`
Rust does type inference not just from the initialization, but from every usage. Thus, its type checker has to look at every usage of a variable to decide what type it is, and needs to deduce and check types as it goes along.
This means that the let () = x;
is part of the same process. It is a usage of x
and thus must be checked to see what concrete type x
could be. The fact that no possible type could match ()
is discovered at the same time that the compiler is still trying to deduce the type of x
, and so no default has been chosen, as the default is only used when the compiler has looked at all usages of x
and not found anything.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With