Что значит "->!" значит в русте - PullRequest
0 голосов
/ 20 марта 2020

Недавно я наткнулся на какой-то фрагмент кода Rust и наткнулся на функцию, которая возвращает «!» вместо базового c типа переменной, вот так:

fn my_function() -> ! {
    //function body
}

Так что мне было интересно, что это значит. Мне не удалось найти информацию об этом в https://doc.rust-lang.org/book Какие данные возвращает функция с таким индикатором?

Ответы [ 2 ]

6 голосов
/ 20 марта 2020

Это означает, что функция никогда не возвращает (обычно потому, что она безоговорочно паникует или иным образом завершает программу, или потому что содержит бесконечное l oop, которое предотвращает возврат).

Приложение описывает его как:

! Всегда пустой тип дна для расходящихся функций

, где «расходящийся» означает «никогда не возвращается» ».

1 голос
/ 20 марта 2020

Чтобы придать дополнительный контекст:

! - это , никогда не набирающий ; это тип, который не имеет возможного значения, поэтому его нельзя создать. Если функция возвращает !, это означает, что она никогда не завершится.

Примеры:

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 {}

Это перечисление не имеет вариантов, поэтому его невозможно создать, поэтому оно эквивалентно !.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...