Подтвердить что ты не робот

Выйти из программы Rust на ранней стадии

Мне нужно, чтобы моя программа выходила, когда пользователь набирает exit. Я использовал только return из цикла, который запрашивал пользователя, но теперь эта логика находится в функции, поэтому, когда я return, она просто выпрыгивает из функции обратно в цикл. Я понимаю, что я мог бы, вероятно, вернуть bools и выйти из цикла, но мне хотелось бы хотя бы узнать, есть ли у Rust возможность рано завершить программы, аналогичные Java System.exit().

4b9b3361

Ответ 1

Обновлено для Rust 1.1

В стабильной версии Rust есть функция std::process::exit(), которая делает именно это: она завершает программу с указанным кодом выхода:

use std::process;

fn main() {
    for i in 0..10 {
        if i == 5 {
            process::exit(1);
        }
        println!("{}", i);
    }
}

Эта функция все же, тем не менее, заставляет программу немедленно завершать работу без разматывания и запуска деструкторов, поэтому ее следует использовать экономно.

Оригинальный ответ ниже.


Вы можете напрямую использовать API C:

#![feature(libc)]
extern crate libc;

fn main() {
    for i in 0..10 {
        if i == 5 {
            unsafe { libc::exit(1); }
        }
        println!("{}", i);
    }
}

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

Насколько я понимаю, правильный способ выхода из программы состоит в том, чтобы каким-то образом прекратить все задачи, тогда процесс завершится автоматически. Вы можете повлиять на его код выхода с помощью std::os::set_exit_status, но я не знаю, как закончить текущую задачу изящно. Может быть, кто-то другой даст ответ на это.

Ответ 2

panic!("Oh no something bad has happened!")

Пример:

    if a * g < 0f32 { panic!("The arithmetric-geometric mean is undefined for numbers less than zero!"); }

В более старой документации вы увидите это как fail! ( "О, ничего плохого здесь не произошло".)

По какой-то причине этот макрос был изменен с отказа до паники. Паника - это путь к неудаче, если вы должны.

[править] Извините. Похоже, вы должны тестировать ввод строки "exit", которая будет зависеть от того, как вы принимаете входные данные (по строке или по аргументам). Затем вы можете отключить программу из цикла при условии обнаружения выхода.

Пример:

loop {
    if exit_found { break }
    else {
        // your thing, which also looks for exit_found
    }
}