【发布时间】:2018-09-02 06:10:29
【问题描述】:
我有几个函数可以通过复制方法在每个迭代中只更改一个集合。当我使用类似this.addA.addB.addC 的东西时,一切都很好。我认为我可以使用复制方法对案例类上的 foldLeft 做同样的事情,不幸的是,它在这种情况下不起作用。请解释一下:
1.为什么折叠的缓冲区总是链接到状态而不是上一个缓冲区。迭代?
2.如何实现这种方法?
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,输出结果:
状态: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: 缺少一个实现 scala.Predef$.$qmark$qmark$qmark(ws.sc2:280) 在 annette.exon.projects.project.wbs.A$A230$A$A230$SimpleState.addABC(ws.sc2:10) 在#worksheet#.#worksheet#(ws.sc2:25)
【问题讨论】:
标签: scala class immutability fold iterable