特性で unapply を使用するにはどうすればよいですか?
import play.api.libs.json.Json
trait Json[T] {
implicit val jsonFormat = Json.format[T]
}
コンパイルエラーが発生します:
No unapply function found
unapply を利用できるように、どうにかしてコンパイラに T をケース クラスにバインドさせることはできますか?
特性で unapply を使用するにはどうすればよいですか?
import play.api.libs.json.Json
trait Json[T] {
implicit val jsonFormat = Json.format[T]
}
コンパイルエラーが発生します:
No unapply function found
unapply を利用できるように、どうにかしてコンパイラに T をケース クラスにバインドさせることはできますか?
これは、Scalaのエクストラクタが存在するための要件です。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でのプログラミングのリンクを参照してください