Scala中同一个受保护的case语句中的多个条件?

时间:2015-04-10 21:49:19

标签: scala

我想在scala匹配语句中堆叠几个条件。在另一种语言中,我可以省略“休息”。在switch语句的情况之间。

我知道我可以将由管道字符分隔的原始备选方案组合起来,但似乎无法找到如何组合保护案例,例如:

val isAdmin = true
myval match {
  case 1 if isAdmin => ...
  case 2 if isAdmin => ...
  case 1 | 2 => // this is fine but doesn't apply the guard, so no use
  case 1 | 2 if isAdmin => // doesn't apply the guard to '1'
  case 1 if isAdmin | 2 if isAdmin => // invalid syntax
}

是否有可能以某种方式合并前两种情况?

1 个答案:

答案 0 :(得分:9)

守卫声明适用于一切,无论是好是坏。这意味着你的例子

  case 1 | 2 if isAdmin => ...

实际上做你想要的和你说的不做,但它也意味着

Option("Hi") match {
  case Some(x) | None if x == "Hi" => 1
  case _ => 0
}

不起作用。 (事实上​​,它甚至无法编译。)

幸运的是,Scala可以让你几乎在任何地方删除def。

def caseNice = 1
Option("Hi") match {
  case Some(x) if x.length < 3 => caseNice
  case None => caseNice
  case _ => 0
}

这就是你应该如何处理从单个case语句难以调用的常用功能。