如何检查用户输入的变量是否为数字(int,float)?

Sae*_* M. 1 rust

如何检查变量(由用户输入)是一个数字,如int,float或其他什么?

我想用match表达式做到这一点:

let mut input = String::new();
io::stdin().read_line(&mut input);
let result = match input {
    // !!??     
}
Run Code Online (Sandbox Code Playgroud)

有可能match吗?

Chr*_*son 6

如果你想匹配某些东西,那么你需要一些东西去构建.您可以匹配字符串切片,但只能匹配有限集,因此这对此没有帮助.

所以让我们有一个匹配的枚举:

enum Value {
    Int(isize),
    Float(f64),
}
use Value::*;  // Make the variants available without Value::
Run Code Online (Sandbox Code Playgroud)

然后,您需要将字符串解析为适当的类型.您可以parse为每种类型使用该方法(如果您对Rust的语法感到满意;否则您可能需要一个更高级的解析器):

fn parse_string(s: &str) -> Option<Value> {
    if let Ok(i) = s.parse() {  // inferred as isize from next line
        Some(Int(i))
    } else if let Ok(f) = s.parse() {
        Some(Float(f))
    } else {
        None
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,按此顺序尝试解析时,顺序很重要; "123"也会解析f64.

我正在将任何解析错误转换为None使用Option而不是Result因为它不清楚错误是什么(因为每个解析都可以返回它自己的错误); 在一个真正的应用程序中,我可能有一个ParseError类型

现在我们可以匹配结果:

fn main() {
    let x = "123";
    match parse_string(x) {
        Some(Int(i)) => println!("int {}", i),
        Some(Float(f)) => println!("float {}", f),
        None => println!("Didn't parse"),
    }
    let x = "123.5";
    match parse_string(x) {
        Some(Int(i)) => println!("int {}", i),
        Some(Float(f)) => println!("float {}", f),
        None => println!("Didn't parse"),
    }
}
Run Code Online (Sandbox Code Playgroud)

Runnable游乐场链接

  • 那些"if let"绑定的推论非常特别.我的意思是以一种好的方式 - 我从中学到了一些东西.谢谢! (2认同)