通过对集合使用迭代复制 case class 的字段

Copy fields of case class by using iteration over collection

我有几个函数只更改一个集合,以防每个迭代器通过复制方法 class。当我使用类似 this.addA.addB.addC 的东西时,一切都很好。我以为我可以用 foldLeft 在 case class 上用复制方法做同样的事情,不幸的是,它在这种情况下不起作用。你能解释一下吗:

1.Why fold 的缓冲区总是 link 声明而不是上一个缓冲区。 iter?

2.How实现这样的方法?

case class SimpleState(list: List[String] = Nil) {

  def addA = copy(list = "4" :: list)
  def addB = copy(list = "5" :: list)
  def addC = copy(list = "6" :: list)
  val bufferABC = List("A","B","C")
  // must iterate over collection
  // expect "A","B","C","4","5","6" in result state
  // ordering doesn't matter
  def addABC = ???

  def addABCfold = bufferABC.foldLeft(this){case (state,str) =>
    state.copy(list = str::list)
  }

  def addABCiter = copy(list = bufferABC ::: list)
}
/////////////// output ////////////////////
val state = SimpleState()
val state2 = state.addA.addB.addC

val addABCfold = state.addA.addB.addC.addABCfold

val addABCiter = state.addA.addB.addC.addABCiter

state.addA.addB.addC.addABC

and ofc,输出结果:

state: SimpleState = SimpleState(List())

state2: SimpleState = SimpleState(List(6, 5, 4))

addABCfold: SimpleState = SimpleState(List(C, 6, 5, 4))

addABCiter: SimpleState = SimpleState(List(A, B, C, 6, 5, 4))

scala.NotImplementedError: an implementation is missing at scala.Predef$.$qmark$qmark$qmark(ws.sc2:280) at annette.exon.projects.project.wbs.A$A230$A$A230$SimpleState.addABC(ws.sc2:10) at #worksheet#.#worksheet#(ws.sc2:25)

您通过 str::list 重复覆盖副本中的列表,其中 list 是封闭 class 中的常量成员。你必须从之前的 state:

中取 list
case class SimpleState(list: List[String] = Nil) {

  def addA = copy(list = "4" :: list)
  def addB = copy(list = "5" :: list)
  def addC = copy(list = "6" :: list)
  val bufferABC = List("A","B","C")
  // must iterate over collection
  // expect "A","B","C","4","5","6" in result state
  // ordering doesn't matter
  def addABC = ???

  def addABCfold = bufferABC.reverse.foldLeft(this){
    case (state,str) =>
      state.copy(list = str::state.list)
  }

  def addABCiter = copy(list = bufferABC ::: list)
}
val state = SimpleState()
println(state.addA.addB.addC.addABCfold)
println(state.addA.addB.addC.addABCiter)

这输出:

SimpleState(List(A, B, C, 6, 5, 4))
SimpleState(List(A, B, C, 6, 5, 4))

虽然我没有看到比简单 ::: 有任何优势...