2013-01-22 109 views
4

如何在特質中使用不適用?斯卡拉不適用於性狀

import play.api.libs.json.Json 

trait Json[T] { 

    implicit val jsonFormat = Json.format[T] 

} 

給出編譯錯誤:

No unapply function found 

我可以採用某種強制編譯器綁定噸至案例類,所以我可以利用不應用?

回答

1

這是斯卡拉的extractors存在的要求。提取器是一種稱爲unapply的方法,通常在對象(通常是所討論的類型的伴隨)中定義。它用於將價值解構成其成分。

下面是一個例子(很做作):

object Extractor1 { 
    def unapply(a: Any): Option[(String, Int)] = 
    Some(a.toString, a.toString.length) 
} 

object ExtractorUse { 
    import Extractor1._ 
    def use { 
    "23 skeedo!" match { 
     case Extractor1(str, length) => printf("str=\"%s\"; length=%d%n", str, length) 
    } 
    } 
} 

在使用中:

scala> ExtractorUse.use 
str="23 skeedo!"; length=10 

如果提取返回None,對手試圖將失敗。同樣,如果結果的邏輯與case條款中提供的模式變量不一致。

還有一個提取序列的對應物,unapplySeq。有關詳細信息,請參閱Scala中的編程鏈接