Обработка ввода UTF-8 на стандартный ввод - PullRequest
2 голосов
/ 09 ноября 2019

В книге , будущим рустам достанется построить угадайку. В этой игре в угадайку есть следующий фрагмент:

let mut guess = String::new();
io::stdin().read_line(&mut guess)
    .expect("Failed to read line");

Хм ... почему бы read_line() потерпел неудачу, подумал я. А потом выяснил трудный путь: вместо 50 я ввел (немецкие клавиатуры ...) и ... строка чтения не удалась.

Так что я решил исправить это быстро.

match io::stdin().read_line(&mut guess) {
    Ok(str) => str,
    Err(_) => println!("Please only enter ASCII characters.");
}

Это вернуло несоответствие типов: Ожидается (), найдено usize
Ах, верно! read_line() возвращает количество введенных байтов в результате Ok. Но я не хочу ничего делать с этой информацией, поэтому я заменил приведенное выше выражение Ok:

Ok(_) => {},

Это работает. Но это правильный способ сделать это? Я в основном говорю программе запускать пустой блок кода на Ok, что я считаю плохим стилем в таких языках, как Java, PHP, JavaScript и т. Д.

1 Ответ

3 голосов
/ 09 ноября 2019

Поскольку вас интересует только одно из спичечных плеч, вы можете использовать привязку if let:

if let Err (_) = io::stdin().read_line(&mut guess) {
    println!("Please only enter ASCII characters.");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...