2015-10-18 62 views
0

我使用Scala的枚舉類型與遊戲框架的讀取和寫入組合。我想有一個像特點:Scala的類型類「視圖」 - 不能在同伴對象訪問方法

trait EnumerationWrites[T <: Enumeration] { 
    def reads(jsonValue: JsValue): JsResult[T] = jsonScope match { 
    case JsString(s) => JsSuccess(T.withName(s)) <-- ERROR! 
    case _ => JsError("String value expected") 
    } 
} 

,然後我會做類似

object MyObject extends EnumerationTrait[T] 

這不工作 - 編譯器不能夠解決的情況下匹配中的T形。問題是什麼?

回答

1

壞消息:你不能調用類型參數的方法withName。你需要一個對象。好消息:這個對象可能是隱含的。如果您熟悉類型類 scala中的概念,您就已經知道了。

所以一般用解串器Enumeration你可以使用函數是這樣的:

implicit def enumerationReads[T <: Enumeration](implicit enum: T): Reads[enum.Value] = { 
    val names: Set[String] = enum.values map (_.toString) 
    Reads { 
    case JsString(s) => if (names contains s) JsSuccess(enum withName s) 
     else JsError(s"could not find value '$s' for $enum") 
    case _ => JsError("String value expected") 
    } 
} 

正如你可以看到它需要枚舉是含蓄,所以你應該對這個喜歡

implicit case object Colors extends Enumeration { 
    val Red, Blue = Value 
} 
聲明枚舉

或爲您的現有物品提供一些隱含價值,如

implicit val colorsEvidence = Colors 
+0

感謝您的回答。不幸的是,我無法使其工作。如果你能詳細闡述一些,或者可能指向一個要點,我將不勝感激。 – ticofab

+0

@ticofab這裏是我用於這個答案的工作表https://gist.github.com/Odomontois/ba6960981ca3989a84e4 – Odomontois