比方说现在有一个需求
当x小于0 打印 "negative"
当x等于0 打印 "zero"
当x大于0 打印 "positive"
加入不使用if...else,用match
fn main(){
let x = 4;
match x {
a if a < 0 => println!("negative"),
a if a ==0 => println!("zero"),
a => println!("positive"),
}
}
除了这样写,好像还可以
fn main(){
let x = 4;
match x {
a @ i32::MIN..=-1 => println!("negative"),
a @ 0 => println!("zero"),
a @ 1..=i32::MAX => println!("positive"),
}
}
但是我还是没搞清楚 @和 if在 match 这里用法的区别,
但我感觉@是不是只能是一个值或者离散值啊,if可以范围
而且好像还可以混用
fn main(){
let x = -1;
match x {
a @ x if a < 0 => println!("negative"),
a if a ==0 => println!("zero"),
a => println!("positive"),
}
}
有点迷糊
1
共 2 条评论, 1 页
评论区
写评论赞
--
👇
aj3n: https://doc.rust-lang.org/reference/expressions/match-expr.html#match-expressions
关键词:patterns -> Identifier patterns, MatchArmGuard 区别就是编译器可以穷尽pattern,但是没法穷尽matcharmguard。 原则上只要能表达出来优先用pattern,这样编译器能帮你分析有无漏掉分支。用matcharmguard可能最后一个分支不是你期望的。 当然你有信心代码逻辑没问题都行无所吊谓;
https://doc.rust-lang.org/reference/expressions/match-expr.html#match-expressions
关键词:patterns -> Identifier patterns, MatchArmGuard 区别就是编译器可以穷尽pattern,但是没法穷尽matcharmguard。 原则上只要能表达出来优先用pattern,这样编译器能帮你分析有无漏掉分支。用matcharmguard可能最后一个分支不是你期望的。 当然你有信心代码逻辑没问题都行无所吊谓;