2014-02-19 55 views
3

如何在scala switch語句中執行一個case block開始執行另一個case block。 (在java中:沒有中斷的情況)。成功匹配後繼續匹配下一個案例的Scala開關

switch(step) { 
    case 0: do something; 
    case 1: do something more; 
    case 2: etc...; 
      break; 
    default: do something else; 
} 

感謝您的幫助!

+0

什麼是錯的這個http://docs.oracle.com/javase/tutorial/java /nutsandbolts/switch.html – lakshman

+0

對不起,我需要在scala中編寫此代碼。 –

+0

我不認爲這是可能的 –

回答

4

如果你不能使用0 | 1 | 2你可以使用的動作列表的解決辦法是這樣的:

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{_()} 
} 

def myMethod(i: Int): Unit = 
    switch(i)(
    0 -> {() => println("do 0")}, 
    1 -> {() => println("do 1")}, 
    2 -> {() => 
     println("do 2") 
     return // instead of break 
    }, 
    3 -> {() => println("do 3")} 
)(default = println("do default")) 


myMethod(1) 
// do 1 
// do 2 

myMethod(3) 
// do 3  

myMethod(5) 
// do default 
+0

謝謝,這是我需要的。 –

2

在斯卡拉,沒有開關的情況下通過。你可以做或(|)代替:

step match { 
    case 0 | 1 | 2 => something 
    ... 
} 
+0

對不起,我編輯了我的問題。我需要這個開關(沒有休息)寫入scala。 –

+0

我對scala並不是很有經驗,但是爲我所知的scala添加了一個解決方案。我不確定是否有更好的方法來做到這一點。 –

4
def myMatch(step: Int): Int = step match { 
    case 0 => { dosomething(); myMatch(step + 1) } 
    case 1 => { dosomethingMore(); myMatch(step + 1) } 
    case 2 => etc() 
    case _ => doSomethingElse(); 
} 

如果性能並不重要,這應該是罰款。

+0

謝謝遞解作品。 –