模式匹配中的Scala自我类型



假设我可以创建一个具有self类型和限制实现的trait,并允许像这样访问成员:

trait A { def a:String }
trait B { def b:String }
trait C {
   self: A with B =>
   lazy val c:String = a+b
}

为什么我不能把这个概念带入模式匹配。我知道下面不工作,但它只是缺少一些语法糖或有限制,阻止这一点?

case class AB( a:String, b:String ) extends A with B
val ab = AB("a","b")
ab match {
  case ab@(A & B) => ab.a + ab.b
}

真正起作用的是这些不那么优雅的版本

ab match {
  case a:A => a match {
    case b:B => a.a + b.b
  }
}
def checkInstanceOf(obj:AnyRef) = 
  obj.isInstanceOf[A] && obj.isInstanceOf[B]
ab match {
  case ab if(checkInstanceOf(ab)) => ab.a + ab.b
}

我的目标是能够编写基于两个或更多正在实现的特征的泛型类型驱动行为。

正常的A with B类型检查:

ab match {
  case ab: A with B => ab.a + ab.b
}

最新更新