したがって、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