2014-04-11 9 views
4

cUpdatable 또는 Drawable 또는 모두 일 수 있다고 가정합니다. 모두 인 경우 먼저 Updatable을 처리하고 싶습니다. 여러 유형의 스칼라 패턴 일치

이 코드를 감안할 때 :

case c: Updatable => c.update() 
case c: Drawable => c.draw() 

하나의 문제가있다 : 그것은 단지 선택 사항 중 하나 평가한다. 때로는 c 둘 다있을 수 있으므로이 두 가지를 모두 실행해야합니다.

case c @ (_: Updatable | _: Drawable) => c.update(); c.draw() 

여기서 문제는 그것이 |을 때문에 내가 updatedraw 모두를 호출 할 수 있다는 것입니다 :

나는 다음과 같습니다 | 메커니즘이 알고있다.

은 내가 이런 식으로 뭔가를 찾고 있어요 생각하지만, 컴파일되지 않습니다 : 그런 일이

case c @ (_: Updatable & _: Drawable) => c.update(); c.draw() 
case c: Updatable => c.update() 
case c: Drawable => c.draw() 

있습니까? 내가 열어서 isInstacenOf이라고 쓸 수는 있겠지만 가능하다면 패턴 매칭을 선호한다.

답변

6
def f(c:Any) = c match { 
    case d:Drawable with Updatable => println("both") 
    case d:Drawable => println("drawable") 
    case u:Updatable => println("updatable") 
} 
+1

이것은 환상적인 아이디어입니다. 왜 내가 이것을 생각하지 않았습니까? ;) –

+2

이 문맥에 사용 된'with' 키워드는 연결됩니다 (분명히). 분리형/공용체 유형에 관심이 있다면이 환상적인 블로그를 확인하십시오. http://www.chuusai.com/2011/06/09/scala-union-types-curry-howard/ –

5

어때?

trait Foo 
trait Bar 
class FooBarImpl extends Foo with Bar 
type FooBar = Foo with Bar 


def matching(x: Any) = x match { 
    case _: FooBar => "i'm both of them" 
    case _: Foo => "i'm foo" 
    case _: Bar => "i'm bar" 
} 

val x = new FooBarImpl 

matching(x) 
// res0: String = i'm both of them 
matching(new Foo{}) 
// res1: String = i'm foo 

반성 여부가 확실하지 않더라도.

+0

통합 유형 정의는 이 패턴 매치가 자주 필요하다면 좋겠지 만, 단 하나의 경우에 나는 랜디가 보여준 것과 같이 갈거야. –

+0

@KaiSellgren 아무것도 외부 형식 별칭을 정의하지 않고'case _ : Foo with Bar'를 쓰지 못하게합니다. –

+0

맞습니다. 당신의 대답은 Landei가했던 것과 기본적으로 같습니다. 나는 달의 각도 때문에 그의 대답을 받아 들였다. –