#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();
Комментариев нет:
Отправить комментарий