Как я могу проверить количество цифр при преобразовании из строки путем сопоставления совпадений? - PullRequest
0 голосов
/ 27 апреля 2019

Я только что закончил Программирование игры на угадывание в The Rust Programming Language . Теперь я хочу добавить проверку количества цифр, но не могу найти приятный способ сделать это.

Я могу добиться этого, заменив

let guess: u32 = match guess.trim().parse() {
    Ok(num) => num,
    Err(_) => {
        println!("Please type a number.");
        continue;
    },
};

с

let guess = guess.trim();
if guess.parse::<u32>().is_err() || guess.chars().count() > 2 {
    println!("Please type a number from 1 to 100.");
    continue;
}
let guess: u32 = match guess.parse() {
    Ok(num) => num,
    Err(_) => continue, // this will never happen
};

Я бы предпочел сделать это путем цепочки спичек, но я не мог этого понять.

Ответы [ 2 ]

4 голосов
/ 27 апреля 2019

Вам не нужно цепного матча.Вам просто нужен другой шаблон:

let guess: u32 = match guess.trim().parse() {
    Ok(num @ 1...100) => num,
    _ => {
        println!("Please type a number within 1-99.");
        continue;
    },
};

Этот шаблон означает «Если это Ok, и у него есть что-то больше 0, но меньше 100, верните его содержимое, в противном случае напечатайте сообщение и продолжите».

2 голосов
/ 27 апреля 2019

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

let guess: u32 = match guess.trim().parse() {
    Ok(num) => match guess.chars().count() {
        1 | 2 => num,
        _ => {
            println!("Please type a number from 1 to 100.");
            continue;
        }
    },
    Err(_) => {
        println!("Please type a number.");
        continue;
    },
};

Однако проверка длины строки - это не то, что вам действительно нужно.Например, «00023» анализирует «23», но имеет длину прочности 5. Поскольку у вас есть доступ к num в этом контексте, вы можете напрямую сопоставить его значение!

// ...
Ok(num) => match num {
    1..=100 => num,
    _ => {
        println!("Please type a number from 1 to 100.");
        continue;
    }
},
// ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...