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

コメントに示されているように、複数のケース クラスを照合できます。ただし、その際に変数を使用することはできません。そのため、変数pointmod変数はそこで使用できません。

ただし、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")
  }
}
于 2013-04-15T15:45:57.923 に答える