2013-04-15 38 views
0

是否有可能以某種方式利用結合符號共同的元素,像一個OR基於模式匹配:綁定提取符號多次或基於模式匹配

import swing._ 
import event._ 

new Label { 
    listenTo(mouse.clicks) 
    listenTo(mouse.moves) 

    reactions += { 
    case MousePressed(_, point, mod, _, _) | MouseDragged(_, point, mod) => 
     println(s"mouse x = ${point.x}, y = ${point.y}, mod = $mod") 
    } 
} 

我能以某種方式使這項工作不寫case語句與相同的身體(我知道我可以寫一個輔助功能)。

+0

可能[在scala中匹配多個案例類]的副本(http://stackoverflow.com/questions/1837754/match-multiple-cases-classes-in-scala) –

回答

1

您可以匹配多個案例類,因爲它已在註釋中指明。但是,當你這樣做時你不能使用變量。所以pointmod變量不能在那裏使用。

但是,如果pointmod領域是什麼,所有的鼠標事件應該有你可以創建鼠標對象的公共類和普通類定義自己不應用方法同伴對象:

abstract class MouseEvent { 
    val point: Point 
    val mod: Mod 
} 

object MouseEvent { 
    def unapply(ev: MouseEvent): Option[(Int, Int)] = Some((ev.point, ev.mod)) 
} 

case class MousePressed(someField: Int, point: Point, mod: Mod, someField2: Int, someField3: Int) extends MouseEvent 

case class MouseDragged(someOtherField: Int, point: Point, mod: Mod) extends MouseEvent 

val ev: Any = MouseDragged(1, 2, 3) 

ev match { 
    case MouseEvent(point, mod) => { 
    println(s"Values are $point and $mod") 
    } 
}