2013-04-15 2 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

수를 [여러 사례 클래스를 스칼라와 매치]의 복제본 (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") 
    } 
}