2011-08-18 2 views
3
object NoSense { 
    def main(args: Array[String]) { 
     val value = "true" match { 
     case value @ (IntValue(_) | BooleanValue(_)) => value 
     } 
     require(value == true) 
    } 
} 

class Value[T](val regex: Regex, convent: String => T) { 
    def unapply(value: String): Option[T] = value match { 
     case regex(value, _*) => Some(convent(value)) 
     case _ => None 
    } 
} 
object IntValue extends Value[Int]("[0-9]+".r, _.toInt) 
object BooleanValue extends Value[Boolean]("((true)|(false))".r, _.toBoolean) 

main 메서드에서 require이 실패합니다.
하지만이 하나는 괜찮습니다스칼라 대체 사례가 다른 유형의 추출 값과 구문을 일치시킵니다.

def main(args: Array[String]) { 
     val value = "true" match { 
     case IntValue(value) => value 
     case BooleanValue(value) => value 
     } 
     require(value == true) 
    } 

그 자체가 스칼라 언어의 한계입니까 아니면 잘못된 방식으로하고 있습니까

답변

7

... 모두 일을하고 있다는 것입니다.

Scala specification §8.1.3에서 패턴 바인더가 어떻게 작동하는지 볼 수 있습니다. 그것은 패턴으로 말합니다 [email protected] :

변수 x의 유형은 패턴 p의 정적 유형 T입니다.

귀하의 경우, p의 패턴은 IntValue(_) | BooleanValue(_)입니다. IntValueBooleanValue unapply-methods 모두 String을 필요로하므로 패턴의 정적 유형은 String이므로 x 유형은 String입니다.

두 번째 경우에는 값이 부울 값에서 추출되고 올바른 유형을 갖습니다.

scala는 추출 패턴의 대안을 지원하지 않으므로 두 번째 버전을 고수해야합니다.

+0

내 경우에 더 좋은 해결책이 있습니까? 추출기를 잘못 사용하고있는 것 같습니까? – jilen

+0

여기서 추출기를 올바르게 사용하지 마십시오. 그러나 당신의 경기는 전부가 아닙니다. 또한 추론 된 값 유형은 모두이며, 상황에 따라 부적절 할 수 있습니다. – Nicolas

관련 문제