通过链接匹配从字符串转换时如何验证位数?

时间:2019-04-27 18:21:22

标签: validation rust

我刚刚完成了 The Rust Programming Language Programming a Guessing Game一章。我现在想添加数字位数的验证,但是找不到一种令人愉悦的方法。

我可以通过替换来实现

<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
    <script src="script.js"></script>
  </head>

  <body>
    <div id="main">
      <p>Here's a test <a href="#" id="704e04ea-9f44-4183-af59-8b89067a7245">link</a> over here. And here's <a href="#" id="3a5306d9-17e7-4414-a192-cf27d885b658">another one</a> over here</p>
    </div>
  </body>

</html>

使用

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

我更愿意这样做的方式是通过某种方式将比赛链接起来,但我无法弄清楚。

2 个答案:

答案 0 :(得分:4)

您不需要链式匹配。您只需要一个不同的模式:

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

此模式的意思是“如果它是Ok,并且它的值大于0但小于100,则返回其内容,否则打印消息并继续。”

答案 1 :(得分:2)

您可以像这样链接匹配项:

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;
    }
},
// ...