是否有可能以某种方式使用基于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 :(得分:1)
您可以匹配多个案例类,如评论中所示。但是,在执行此操作时,您无法使用变量。因此,point
和mod
变量不能在那里使用。
但是,如果point
和mod
字段是所有鼠标事件应该具有的内容,则可以为鼠标对象创建公共类,并在公共类的伴随对象中定义自己的unapply方法:
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")
}
}