如何检查变量(由用户输入)是一个数字,如int,float或其他什么?
我想用match
表达式执行此操作:
let mut input = String::new();
io::stdin().read_line(&mut input);
let result = match input {
// !!??
}
是否可以match
?
答案 0 :(得分:6)
如果你想要匹配某些东西,那么你需要一些东西去构建。您可以匹配字符串切片,但只能匹配有限集,因此这对此没有帮助。
所以让我们有一个匹配的枚举:
enum Value {
Int(isize),
Float(f64),
}
use Value::*; // Make the variants available without Value::
然后,您需要将字符串解析为适当的类型。您可以对每种类型使用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
}
}
请注意,按此顺序尝试解析时,顺序很重要; "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"),
}
}