如何匹配匹配的案例以及下面的另一个案例?

问题描述 投票:1回答:3

我知道我不能在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上做同样的事情?

scala switch-statement match break
3个回答
2
投票

它可以完成,但你必须定义自己的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"))

总而言之,可能比它的价值更麻烦。


3
投票

您需要编写两次(或更多)代码。在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)

0
投票

您无法在没有代码重复的情况下将Java代码直接转换为Scala,因为您无法在一次传递中在match语句中执行多个替代方法。但是,为避免替代方案中的代码重复,您可以做的是多次处理相同的匹配语句,

例如

qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.