在基于OR的模式匹配中多次绑定提取符号

时间:2013-04-15 11:16:09

标签: scala pattern-matching

是否有可能以某种方式使用基于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语句(我知道我可以写一个辅助函数)。

1 个答案:

答案 0 :(得分:1)

您可以匹配多个案例类,如评论中所示。但是,在执行此操作时,您无法使用变量。因此,pointmod变量不能在那里使用。

但是,如果pointmod字段是所有鼠标事件应该具有的内容,则可以为鼠标对象创建公共类,并在公共类的伴随对象中定义自己的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")
  }
}