내가이 작업을 수행 할 수 있도록하려는 int로 적용 취소 추가스칼라 -
scala> val Int(i) = "1"
i: Int = 1
그러나 Int
가 unapply
방법이 없습니다.
기존 개체에 암시 적으로 메서드를 추가하는 방법에 대한 지침을 제공하는 this answer을 발견 했으므로 사용해 보았습니다. 그들이 제공 한 솔루션은 작동하지만, 불행히도 패턴 매칭에는 적합하지 않습니다. 여기에 내가 가진 무엇 :
object UnapplyInt {
val IntRE = """^(\d+)$""".r
def unapply(v: String): Option[Int] = v match {
case IntRE(s) => Some(s.toInt)
case _ => None
}
}
implicit def int2unapplyInt(objA: Int.type) = UnapplyInt
이 테스트 케이스는 모두 괜찮 :
가val UnapplyInt(i) = "1" // pattern matching with unapply is fine
val i = Int.unapply("1").get // implicit conversion is fine
하지만 내가 원하는 하나가 실패 :
scala> val Int(i) = "1"
<console>:10: error: object Int is not a case class constructor, nor does it have an unapply/unapplySeq method
val Int(i) = "1"
^
암시 적 변환 작품과 패턴이 unapply
와 일치하는 경우 왜 스칼라는 함축적 인 패턴 매칭을 위해이 두 가지를 함께 사용하지 않는가?
하! 당신이 제안한 솔루션은 현재 제가 사용하고있는 솔루션입니다. 저는 두 개의 다른 네임 스페이스가 필요하기 때문에 완전히 만족하지 않습니다. 즉 Int.MaxValue와 val Int (i) = "5"를 같은 위치에 둘 수 없습니다. – dhg
@dhg True. 그리고 이제는 그것에 대해 더 많이 생각합니다. 제 대답의 추론이 옳지 않다고 생각합니다. 진짜 이유는 패턴 표현식이 정규식과 같을 수 없다는 것입니다. 왜냐하면 스칼라는 어떤 것이 생성자이고 무엇이 변수인지 식별해야하기 때문입니다 ... – Owen
당신은 그 마지막 부분에서 나를 잃었습니다. 대답에 대해 – dhg