Scalaでcase classのメンバーを更新する

Scalaを始めて1ヶ月ぐらいたったので、つまづいたところをまとめていこうと思う。

Scalaは基本的にcase classという雛形的なclassを使うようにするんですが、メンバーをどう更新するか分からなかったのでメモ。

例えば、ユーザー情報が入ったモデルがあったとします。

case calss User(
        name: String,
        email: String,
        age: Int,
        city: String,
        tel: String,
        zipCode: String)

このモデルをなんかしらの処理で取得します。そして、ageだけを29として更新したいとします。Javaならセッターがあるけど、scalaではvalで宣言されてるからセットはできない。

最初はこんな風に書いてまして。

val user = getSomeUser
val newUser = User(
        user.name,
        user.email,
        29,
        user.city,
        user.tel,
        user.zipCode)

なんかめんどくさいけど、immutableとはこういことかなと勝手に納得してたけど、そんなことはなくて、ひしだまさんのブログ見てて、copyというメソッドを用意されてることに気づいた。

val user = getSomeUser
val newUser = user.copy(age = 29)

これだけでよかった。引数の名前付き呼び出しって便利だし分かりやすくていいですね