How to clone a case class instance and change just one field in Scala?

后端 未结 5 1622
难免孤独
难免孤独 2020-11-30 17:58

Let\'s say I have a case class that represents personas, people on different social networks. Instances of that class are fully immutable, and are held in immutable collecti

5条回答
  •  心在旅途
    2020-11-30 18:13

    I didn't want to include a big library to do complex lenses that let you set values deep in nested case classes. It turns out it is just a few lines of code in the scalaz library:

      /** http://stackoverflow.com/a/5597750/329496 */
      case class Lens[A, B](get: A => B, set: (A, B) => A) extends ((A) => B) with Immutable {
        def apply(whole: A): B = get(whole)
    
        def mod(a: A, f: B => B) = set(a, f(this (a)))
    
        def compose[C](that: Lens[C, A]) = Lens[C, B](
          c => this(that(c)),
          (c, b) => that.mod(c, set(_, b))
        )
    
        def andThen[C](that: Lens[B, C]) = that compose this
      }
    

    You can then create lenses that set deeply nested values far easier than using the built in copy feature. Here is a link to a big set if complex lenses that that my library uses to set heavily nested values.

提交回复
热议问题