我知道我不能在Scala break
声明中使用match
。
是否有匹配案例和以下案例的原因?
例如,在Java中,我可以执行以下操作:
int i=3;
switch(i) {
case 1:
a();
break;
case 2:
b();
case 3:
c();
case 4:
d();
break;
default: z();
}
我如何在Scala上做同样的事情?
它可以完成,但你必须定义自己的switch
方法。
// switch statement with dropthrough logic
def switch[T](i: T)(actions: (T, () => Unit)*)(default: => Unit) = {
val acts = actions.dropWhile(_._1 != i).map{_._2}
if (acts.isEmpty) default
else acts.foreach{_()}
}
这有效,但它的语法略显不正统。而且因为它需要一个return
而不是break
,所以不应该有这个switch
之后的代码。
def someMethod(i:Int): Unit =
switch(i)(
1 -> {() => println("do 1"); return}, // return instead of break
2 -> {() => println("do 2")},
3 -> {() => println("do 3")},
4 -> {() => println("do 4")} // no comma after final case
)(default = println("do default"))
总而言之,可能比它的价值更麻烦。
您需要编写两次(或更多)代码。在Scala中,不可能从一个case
到另一个val i = 3
i match {
case 1 => a()
case 2 => {
b()
c()
d()
}
case 3 => {
c()
d()
}
case 4 => d()
case _ => z()
。即使在可能的语言中,通常也不是一个好主意;它可能是难以发现的错误的来源(尽管有些情况下可以有效地使用它)。
在Scala中,代码看起来像这样:
@tailrec
def switch(x : Int): Unit =
x match {
case 1 => a()
case 2 => b(); switch(3)
case 3 => c(); switch(4)
case 4 => c()
case _ => z()
}
switch(3)
您无法在没有代码重复的情况下将Java代码直接转换为Scala,因为您无法在一次传递中在match语句中执行多个替代方法。但是,为避免替代方案中的代码重复,您可以做的是多次处理相同的匹配语句,
例如
qazxswpoi