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

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

fn main() {

}

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

5 ответов


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


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

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


по состоянию на Руст 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 (по крайней мере, на моей машине).


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

ржавчина, безусловно, может быть разработана для этого. Вообще-то, раньше.

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

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


Как отмечали другие,std::process::exit(code: i32) это путь сюда

дополнительная информация о том, почему приведена в RFC 1011: выход процесса. Обсуждение RFC находится в запрос на вытягивание RFC.


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