我想在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
}
是否有可能以某种方式合并前两种情况?
答案 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
语句难以调用的常用功能。