Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Обработка ошибок в Rust

#rust


Есть программа на rust, взятая отсюда: Учебник по Rust

Захотелось мне, чтобы программа постоянно выводила собственный префикс ("guess_game>>
"). По-этому немного пришлось подкорректировать строки перед запросом ввода.

В оригинале было так

println!("Пожалуйста, введите предположение.");


Если просто заменить println! на print!, у меня вывод сбрасывался на терминал слишком
поздно. Выход был найден в принудительном вызове stdout().flush(). Но, когда я добавил
обработку ошибок, как приведена ниже, при запуске программы стали бесконечно рисоваться
строки "guess_game>> try: ". Прошу объяснить, почему так и какова логика?

extern crate rand;

use std::io::stdin;
use std::io::Write;
use std::io::stdout;
use rand::Rng;
use std::cmp::Ordering;

fn main() {
    let snum = rand::thread_rng().gen_range(1, 101);
    println!("guess_game>> rnd: {}", snum);

    loop {
        let mut guess = String::new();

        print!("guess_game>> try: ");
        match stdout().flush() {
            Ok(_)  => continue,
            Err(_) => continue,
        };

        stdin().read_line(&mut guess)
               .ok()
               .expect("Fail read line");

        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_)  => continue,
        };

        match guess.cmp(&snum) {
            Ordering::Less    => println!("guess_game>> Less"),
            Ordering::Equal   => {
                println!("guess_game>> Equal");
                break;
            }
            Ordering::Greater => println!("guess_game>> Greater"),
        }
    }
}


UPD:
Решение:

print!("guess_game>> try: ");
match stdout().flush() {
    Ok(_)  => (),
    Err(_) => (),
};

    


Ответы

Ответ 1



У вас бесконечно выводится guess_game>> try: по тому, что у вас получился бесконечный цикл.

Ответ 2



Более удобный способ проигнорировать ошибку в Result - превратить его в Option: stdout().flush().ok(); Однако, с точки зрения надежности, игнорировать ошибки вывода все же не стоит. Чтобы получить панику с информацией об ошибке, можно воспользоваться методом unwrap: stdout().flush().unwrap();

Комментариев нет:

Отправить комментарий