에 포괄 성 확인을 보존 추출기와 케이스 클래스 상속 교체 이 같은 경기 블록 :I는 정점의 여러 가지 유형이 경우에 클래스를 사용하여 구현 그래프와 같은 구조를 나타내는 간단한 클래스 계층이 스칼라
def test (x: Node) = x match {
case _ : Arc => "got arc"
case _ : Vertex => "got vertex"
}
또는이 같은 :
def test (x: Node) = x match {
case _ : Arc => "got arc"
case c : Vertex => c match {
case _ : VertexType1(a) => "got type 1 vertex " + a
case _ : VertexType2(a) => "got type 2 vertex " + a
}
}
이 구현에는 다음과 같은 속성이 있습니다.
1) 특정 정점 유형 간에는 아니지만 정점 유형을 구별하는 블록과 일치하는 호와 정점을 구별하는 일치 블록을 작성할 수 있습니다.
2) 정점 유형별 및 비 정점 유형별 일치 블록 모두에서 패턴 일치의 완전성이 검사됩니다.
그러나 사례 클래스의 상속은 권장되지 않으며 컴파일러는 잎이 아닌 노드에서의 일치를 지원하기 위해 대신 추출기를 사용하는 것이 좋습니다 (예 : 위 예제에서는 호와 정점을 구별하지만 꼭지점 유형간에 구분하지 않음) .
질문 : 케이스 클래스 상속을 사용하지 않고 유사한 클래스 계층 구조를 구현할 수 있습니까? 그렇지만 위에 표시된 사용 사례 둘 다에서 컴파일러가 수행 한 패턴 완전성 검사는 여전히 있습니까?
EDIT : 일치 유형이 유형에만 적용되지 않도록 VertexType 클래스에 생성자 매개 변수를 추가했습니다.
sealed trait Node
sealed abstract class Vertex extends Node
class Arc extends Node
class VertexType1 (val a:Int) extends Vertex
class VertexType2 (val b:Int) extends Vertex
object VertexType1 {
def unapply (x : VertexType1) : Some[Int] = Some(x.a)
}
object VertexType2 {
def unapply (x : VertexType2) : Some[Int] = Some(x.b)
}
그리고 테스트 코드 :
def test (x: Node) = x match {
case _ : Arc => "got arc"
case v : Vertex => v match {
case VertexType1(a) => "got vertex type 1 " + a
}
}
내가 두 번째 블록이 아닌 철저한 경기에 대한 경고를 기대 VertexType2은 (다음과 같은 경우 클래스없는
나의 현재 구현은 결코 일치하지 않음).
2.9.0-RC3 이전의 스칼라 컴파일러는 실제로 볼 수는 있지만 RC3 (2.9.0 및 2.9.0-1 포함)로 시작하는 버전은 그렇지 않다는 경고를 생성합니다. 다소 혼란 스럽습니다.
완전성을 위해 : 이것은 스칼라 2.10에서 수정되었습니다. (Scala 2.9.x에서 회귀가있었습니다.) – gourlaysama