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具有相同主体的语句(我知道我可以编写一个辅助函数)。

4

1 回答 1

1

您可以匹配多个案例类,如评论中所示。但是,这样做时不能使用变量。所以pointandmod变量不能在那里使用。

但是,如果pointandmod字段是所有鼠标事件都应该有的东西,您可以为鼠标对象创建一个公共类并在公共类的伴随对象中定义您自己的 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")
  }
}
于 2013-04-15T15:45:57.923 回答