【问题标题】:Copy fields of case class by using iteration over collection通过在集合上使用迭代来复制案例类的字段
【发布时间】: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


    【解决方案1】:

    您通过str::list 反复覆盖副本中的列表,其中list 是封闭类的常量成员。你必须从之前的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))
    

    我看不出比简单的::: 有任何优势...

    【讨论】:

    • Spasibo tovarisch!
    • @EldarNezametdinov Pozhaluista,tovarischtsch,rad pomotsch! :]
    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2016-02-16
    • 2014-12-27
    • 2021-04-01
    相关资源
    最近更新 更多