33

applyおよびメソッドの正しい使用法をよりよく理解しようとしていunapplyます。

シリアライズおよびデシリアライズしたいオブジェクトを考えると、これは and を使用する正しい使用法 (つまり、 Scalaの方法)ですか?applyunapply

case class Foo
object Foo {
    apply(json: JValue): Foo = json.extract[Foo]
    unapply(f: Foo): JValue = //process to json
}
4

3 に答える 3

5

したがって、apply と unapply は、追加の構文サポートを持つ単なる def です。

Apply は引数を取り、慣例により、オブジェクトの名前に関連する値を返します。Scala のケース クラスを「正しい」使用法と見なすと、オブジェクト Foo の apply は、「new」を追加する必要なく Foo インスタンスを構築します。もちろん、apply を好きなように実行することは自由です (Map の key から value への値、set には Set の値が含まれ、Seq のインデックス付けが思い浮かびます)。

Option または Boolean を返す場合は適用しないでください。これは match{} とパターン マッチングで使用できます。apply と同様に、これは単なる def であるため、思いついたことは何でも実行できますが、一般的な使用法は、オブジェクトのコンパニオン クラスのインスタンスから値を抽出することです。

シリアライゼーション/デシリアライゼーションの定義を扱ってきたライブラリから、明示的に名前が付けられる傾向があります。たとえば、書き込み/読み取り、表示/読み取り、toX/fromX など。

この目的で apply/unapply を使用したい場合は、次のように変更することをお勧めします

def unapply(f: Foo): Option[JValue]

次に、次のようなことができます。

val myFoo = Foo("""{name: "Whiskers", age: 7}""".asJson)
// use myFoo

val Foo(jval) = myFoo
// use jval
于 2013-09-23T17:49:13.110 に答える