2013-04-16 2 views
0

당신은 예를 들어 스칼라의 패턴 매칭 (경우)이있는 경우 :스칼라 패턴 대/소문자로 모든 캐치 유형을 어떻게 결정합니까?

foo match { 
    case a: String => doSomething(a) 
    case f: Float => doSomethingElse(f) 
    case _ => ? // How does one determine what this was? 
} 

실제로 포괄에 붙 잡혔다 유형을 결정하는 방법이 있나요를?

+0

"Any"는 "String"과 "Float"의 유일한 상위 유형 인 경우 이상적으로 트래 피킹하지 않을 것입니다. –

+0

나는 그것이 보내는 모든 유형을 문서화하지 않은 제 3 자 라이브러리에서 호출 된 배우가 있습니다 ....하지만 빠른 답변 주셔서 감사합니다! –

답변

2
foo match { 
    case a: String => doSomething(a) 
    case f: Float => doSomethingElse(f) 
    case x => println(x.getClass) 
} 
5
case x => println(x.getClass) 

너무 쉽게 :-)

는 기본적으로, 당신은 단지 당신이 표준을 사용할 수 있습니다 (이 경우 x)의 이름으로 포괄 문에서 값을 바인드해야 getClass 메소드를 사용하여 유형을 판별하십시오.

유형을 기반으로 특정 논리를 수행하려는 경우 문제가 발생할 가능성이 큽니다. 인라인으로 정의하고 싶지 않은 '기본'사례가 필요한 경우 부분 일치 함수로 성명을 작성할 수 있습니다. 예를 들어

scala> val defaultHandler: PartialFunction[Any, Unit] = { 
    | case x: String => println("String: " + x) 
    | } 
defaultHandler: PartialFunction[Any,Unit] = <function1> 

scala> val customHandler: PartialFunction[Any, Unit] = { 
    | case x: Int => println("Int: " + x) 
    | } 
customHandler: PartialFunction[Any,Unit] = <function1> 

scala> (customHandler orElse defaultHandler)("hey there") 
String: hey there 
+1

클래스는 실제로 유형이 아닙니다. 잠재적으로 많은 유형이 단일 클래스에 매핑됩니다. –

관련 문제