Чтобы придать дополнительный контекст:
!
- это , никогда не набирающий ; это тип, который не имеет возможного значения, поэтому его нельзя создать. Если функция возвращает !
, это означает, что она никогда не завершится.
Примеры:
fn panics() -> ! {
panic!()
}
fn loops_forever() -> ! {
loop { }
}
В настоящий момент тип !
нестабилен, поэтому он может использоваться только в обратном положении . В будущем, когда тип never стабилизируется, мы сможем написать что-то вроде Result<T, !>
(результат, который никогда не будет ошибкой).
Обратите внимание, что !
может быть приведен к любому другому типу. Это означает, что !
является подтипом любого другого типа. Из-за этого его часто называют «нижним типом». Это означает, что нам разрешено писать, например:
let x: i32 = if some_condition {
42
} else {
panic!("`!` is coerced to `i32`")
};
Поскольку !
не работает на стабильном Rust (кроме как в возвращаемой позиции), существует обходной путь для получения аналогичного типа:
enum Never {}
Это перечисление не имеет вариантов, поэтому его невозможно создать, поэтому оно эквивалентно !
.