1

私はScalaを学んでいて、json4sを使用してJSON解析を試すことにしました。逆シリアル化にXPath構文を使用することにしましたが、これまでに見たことのない奇妙な構文に出くわしました。

val json = JsonMethods.parse("""{"meaningOfLife": 42}""")
val JInt(x) = json\"meaningOfLife"

私を混乱させる部分は、ここにあるこのビットです

val JInt(x) = ...

そこで何が起こっているのか、頭を悩ませることはできません。この構文を検索する方法や、それが何と呼ばれているのかさえわかりません。誰かが私を助けることができますか?Scalaは、C++やJavaなどの他の言語では慣れていない多くの優れた機能を備えた素晴らしい言語です。

編集

明確にするために、が定義されていないために混乱してxいますが、それはどういうわけか関数またはコンストラクターに渡され、その結果に割り当てられて、json\"meaningOfLife"が返されますJValue

編集2

調査して遊んだ結果、これはケースクラスと関係があることがわかりました。次のコードを実行できました。

case class MyCaseClass (x: Int)
val MyCaseClass(x) = new MyCaseClass(5)
println(x, x.getClass) // prints (5,int)

これは、いくつかのコードを見た後、何が起こっているのかをよく理解するのに役立ちます。

val MyCaseClass(x) = MyCaseClass(5)

インスタンス化されたInt値から(より適切な用語がないために)抽出し、それをに格納しています。つまり、タイプはになります。5MyCaseClassxxInt

json4sのコードでは、aJIntJValue演算\子が返すaです。つまり、は(クラスに保存されている)JInt(x)を取り出し、それを私が収集したものからの値に入れています。BigIntJIntx

しかし、まだ質問があります。このプロセスは何と呼ばれていますか?それに関するドキュメントはありますか?

4

1 に答える 1

5

これは「反駁できないパターンマッチング」と呼ばれ、基本的に次のコードと同等です。

val json = JsonMethods.parse("""{"meaningOfLife": 42}""")

val x = json match {
  case JInt(xMatched) => xMatched
}

つまり、宣言の左側のパターンに適合する任意のケースクラスまたは任意のエクストラクタをこの方法で使用できます。

補遺:

「反駁できない」とはMatchError、パターンが満たされない場合にaがスローされることを意味します。

于 2013-02-05T02:45:38.240 に答える