我有一个简单的类层次结构代表了几个不同类型顶点的使用情况下,类实现的图形状结构:更换的情况下类的继承与提取保存全面性检查斯卡拉
sealed trait Node
sealed abstract case class Vertex extends Node
case class Arc extends Node
case class VertexType1 (val a:Int) extends Vertex
case class VertexType2 (val b:Int) extends Vertex
这让我写匹配块是这样的:
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)在这两个顶点类型特异性和非顶点类型专用匹配块模式匹配的穷尽被检查。
但是,不推荐使用case类的继承,编译器建议使用提取器来支持非叶节点上的匹配(即,在上例中,为了区分弧和顶点,而不是在顶点类型之间) 。
的问题:是有可能实现类似的类层次结构,而无需使用情况下类的继承,但仍具有图案全面性如上所示通过在这两种情况下,使用编译器执行检查?
编辑:我已经向VertexType类添加了一个构造函数参数,以便匹配不仅仅在类型上执行。
我没有case类目前实现如下:
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之前的Scala编译器产生了一个我期望看到的警告,但是以RC3开头的版本(包括2.9.0和2.9.0-1)没有,这相当混乱。
倍数:这已被固定在斯卡拉2.10。 (在Scala 2.9.x中出现了回归) – gourlaysama 2013-01-31 16:16:51