< 返回版块

cybertheye 发表于 2024-04-21 21:37

比方说现在有一个需求

当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"),

      }
  }

有点迷糊

评论区

写评论
Mike Tang 2024-04-22 09:30

--
👇
aj3n: https://doc.rust-lang.org/reference/expressions/match-expr.html#match-expressions

关键词:patterns -> Identifier patterns, MatchArmGuard 区别就是编译器可以穷尽pattern,但是没法穷尽matcharmguard。 原则上只要能表达出来优先用pattern,这样编译器能帮你分析有无漏掉分支。用matcharmguard可能最后一个分支不是你期望的。 当然你有信心代码逻辑没问题都行无所吊谓;

aj3n 2024-04-22 01:11

https://doc.rust-lang.org/reference/expressions/match-expr.html#match-expressions

关键词:patterns -> Identifier patterns, MatchArmGuard 区别就是编译器可以穷尽pattern,但是没法穷尽matcharmguard。 原则上只要能表达出来优先用pattern,这样编译器能帮你分析有无漏掉分支。用matcharmguard可能最后一个分支不是你期望的。 当然你有信心代码逻辑没问题都行无所吊谓;

1 共 2 条评论, 1 页