2015-08-17 219 views
1

斯卡拉自我類型考慮到我可以創建具有自身的類型和限制的執行,並給出這樣的訪問成員特點:模式匹配

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 [email protected](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 
} 

我的目標是能寫基於正在實施兩個或多個性狀通用型主導的行爲。

回答

5

一個正常的類型檢測類型A with B作品:

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

笏!我以爲我是第一次嘗試這個,但顯然不是。 – Magnus

+0

斯卡拉模式匹配是輝煌的,我不知道你可以做到這一點。然而,當我想到它時,Java 8現在有類似的東西 – Dici