, 위의 코드에서::에 대한 패턴 매칭은 어떻게 구현됩니까? 예를 들어
List(1, 2, 3) match {
case x :: y => (x, y)
}
는 패턴 매칭은 자동으로 비어 있지 않은 List
이 경우 x :: y
일치하는 것을 발견 할 것이다. 나는 이것이 왜 발생 하는지를 알고 싶다.
우리 모두가 알다시피, List
클래스에는 ::
방법이 있습니다. 또한, 나는 ::
경우 클래스는 "list.scala"에있다 찾을 :
/** A non empty list characterized by a head and a tail.
* @param head the first element of the list
* @param tl the list containing the remaining elements of this list after the first one.
* @tparam B the type of the list elements.
* @author Martin Odersky
* @version 1.0, 15/07/2003
* @since 2.8
*/
@SerialVersionUID(509929039250432923L) // value computed by serialver for 2.11.2, annotation added in 2.11.4
final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {
override def tail : List[B] = tl
override def isEmpty: Boolean = false
}
따라서, 우리는 ::(1, Nil)
새로운 List
을 구성 작성할 수 있습니다. 무엇 스칼라에서 중위 표기법으로, 우리는 동등하게 1 :: Nil
을 쓸 수 있습니다, 더 (이 Nil.::(1)
어쩌면 약간의 우선 순위 규칙으로 인해보다는 ::(1, Nil)
를 호출됩니다 것을 알 수 있습니다.) 그 결과
, 나는 추측 case 클래스 ::
은 ::
의 패턴 일치와 관련이 있습니다 (예 : x :: y
은 ::.unapply
과 일치합니다). 그러나 케이스 클래스 ::
에 대한 unapply
메소드 또는 컴패니언 객체를 찾지 못했습니다.
아무도 내 추측이 맞는지 말해 줄 수 없습니까? 그렇지 않다면, ::
에 대한 패턴 일치가 스칼라에서 어떻게 구현됩니까?
감사합니다.
은 편집 :는
물론, ::
같은 경우 클래스가하는 ::.unapply
자동 ::
생성됩니다. 따라서 나는 이 ::
(예 : :((1,2))의 인스턴스와 일치 함을 이해할 수 있습니다. 그러나 우리 모두 알고 있듯이 case x :: y
은 유형의 모든 인스턴스 (기본 클래스는 ::
)와 일치합니다. 따라서 나는 약간의 특별한 unapply
가있을 것 같아 내 추측이 맞았다. 그것은 생성자 패턴이라고
'::. unapply'가 존재합니다. 왜냐하면':'인 사례 클래스에 대해'unapply'가 자동으로 생성되기 때문입니다. –
감사합니다. @ m-z,'x :: y'가'::'case 클래스의 인스턴스와 일치하는 이유를 이해할 수 있습니다. 하지만 왜 그것도 일반적인 클래스'::'의 기본 클래스 인 List와 일치하는지 알 수는 없습니다. –
@mz, 내가 틀렸다면 나를 바로 잡아주세요, 자동으로 생성 된'D.unapply'는'D'의 인스턴스와 일치하지만 D의 기본 클래스는 일치하지 않습니다. –