Mag*_*nus 1 scala pattern-matching self-type
鉴于我可以创建一个具有自我类型的特征并限制实现并提供对这样的成员的访问:
trait A { def a:String }
trait B { def b:String }
trait C {
self: A with B =>
lazy val c:String = a+b
}
Run Code Online (Sandbox Code Playgroud)
为什么我不能将这个概念带入模式匹配.我知道下面的方法不起作用,但是它只是缺少一些语法糖还是有限制可以防止这种情况发生?
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
}
Run Code Online (Sandbox Code Playgroud)
这些不那么优雅的版本有什么用呢
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
}
Run Code Online (Sandbox Code Playgroud)
我的目标是能够基于正在实现的两个或更多特征来编写泛型类型驱动的行为.
类型A with B工作的正常类型检查:
ab match {
case ab: A with B => ab.a + ab.b
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
301 次 |
| 最近记录: |