Почему Rust не имеет возвращаемого значения в основной функции и как вернуть значение в любом случае?

В Rust основная функция определяется следующим образом:

fn main() {

}

Однако эта функция не учитывает возвращаемое значение. Почему язык не позволяет получить возвращаемое значение и есть способ вернуть что-то в любом случае? Смогу ли я безопасно использовать функцию C exit(int), или это вызовет утечки и еще что-то?

Ответ 1

Начиная с Rust 1.26, main может вернуть Result:

use std::fs::File;

fn main() -> Result<(), std::io::Error> {
    let f = File::open("bar.txt")?;

    Ok(())
}

Возвращенный код ошибки в этом случае равен 1 в случае ошибки. С File::open("bar.txt").expect("file not found"); вместо этого возвращается значение ошибки 101 (по крайней мере, на моем компьютере).

Кроме того, если вы хотите вернуть более общую ошибку, используйте:

use std::error::Error;
...

fn main() -> Result<(), Box<dyn Error>> {
   ...
}

Ответ 2

std::process::exit(code: i32) - это способ выхода с кодом.


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

В Rust есть способ написать main функцию, которая возвращает значение, однако оно обычно абстрагируется в stdlib. Подробности смотрите в документации по написанию исполняемого файла без stdlib.

Ответ 3

reddit thread на этом имеет объяснение "почему":

Конечно, для этого можно было бы создать ржавчину. Фактически это имело место.

Но из-за целевой модели Rust использует основную задачу fn, которая может начать кучу других задач, а затем выйти! Но одна из этих задач может захотеть установить код выхода ОС после того, как main ушел.

Вызов set_exit_status является явным, простым и не требует, чтобы вы всегда ставили 0 в нижней части основного, когда вам в противном случае не волновать.

Ответ 5

Вы можете установить возвращаемое значение с помощью std::os::set_exit_status.