4

特性で unapply を使用するにはどうすればよいですか?

import play.api.libs.json.Json

trait Json[T] {

  implicit val jsonFormat = Json.format[T]

}

コンパイルエラーが発生します:

No unapply function found

unapply を利用できるように、どうにかしてコンパイラに T をケース クラスにバインドさせることはできますか?

4

1 に答える 1

1

これは、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でのプログラミングのリンクを参照してください

于 2013-01-22T14:54:31.980 に答える