The Never type !
represents the type of computations which never resolve to any value at all.
break
, continue
and return
expressions also have type !
. For example we are allowed to
write:
let x: ! = {
return 123
};
Although the let
is pointless here, it illustrates the meaning of !
. Since x
is never
assigned a value (because return
returns from the entire function), x
can be given type
Never
. We could also replace return 123
with a revert()
or a never-ending loop
and this code
would still be valid.
A more realistic usage of Never
is in this code:
let num: u32 = match get_a_number() {
Some(num) => num,
None => break,
};
Both match arms must produce values of type [u32
], but since break
never produces a value
at all we know it can never produce a value which isn't a [u32
]. This illustrates another
behaviour of the !
type - expressions with type !
will coerce into any other type.
Note that !
type coerces into any other type, another example of this would be:
let x: u32 = {
return 123
};
Regardless of the type of x
, the return block of type Never
will always coerce into x
type.
fn foo() {
let num: u64 = match Option::None::<u64> {
Some(num) => num,
None => return,
};
}