【问题标题】:How can I add a member to list(immutable) in scala? [duplicate]如何在 scala 中将成员添加到列表(不可变)? [复制]
【发布时间】:2017-07-03 08:04:42
【问题描述】:

我想向列表中添加一个成员,但该列表是不可变的。有人告诉我,Scala 在许多方面都更喜欢不可变列表。提前致谢。

 class Family[T]{
    val list: List[T] = List();
    def add(member: T): Unit = { member :: this.list }
    def getFamilyNames(f: T => String){
        println(list.size)
        list.foreach {
            println
        }
    }
}

【问题讨论】:

  • 这取决于您希望哪个部分不可变。如果您想要一个不可变列表,可以将其保存在可变变量中,即var list = List.empty[T],然后更新该列表的引用

标签: scala


【解决方案1】:

您可以将可变列表称为ListBuffer[T]ArrayBuffer[T]

class Family[T]{

  val list = ListBuffer[T]()

  def add(member: T): Unit = { this.list+=member }

  def getFamilyNames(f: T => String){

    println(list.size)
    list.foreach {
      println
    }
  }

}

class SomeSpecs extends FunSuite with Matchers {

  test("adds value to family") {

    val fam  = new Family[String]
    fam.add(new String("some value"))
    fam.add(new String("some other value"))

    fam.list shouldBe ListBuffer("some value", "some other value")
  }
}

请阅读Which scala mutable list to use?了解更多信息。

【讨论】:

    【解决方案2】:

    您的add 方法没有达到您的预期。 member :: this.list 确实返回了一个新列表,其中添加了额外的成员。但是,您明确丢弃了 List[T] 类型的返回值。也就是说,在列表中添加元素不会修改列表:它只是返回一个新的不可变列表。 您可能想要的是:

    var list: List[T] = List() // this must be a var to reassign to it
    ...
    def add(member: T): Unit = { list = member :: this.list }
    

    不过,如果您想坚持使用函数式方法,通常会希望避免副作用

    【讨论】:

      【解决方案3】:

      如果你想让所有东西都不可变,那么你应该创建 Family 的新实例,因为在其他情况下,Family 的实例是可变的

      class Family[T](list: List[T] = List()){
        def add(member: T): Unit = new Family(member :: this.list)
      }
      

      如果 Family 是一个 Bulder,那么最好使用可变集合。如果它不是构建器,请查看它的用法,可能根本不需要“添加”方法。

      【讨论】:

      • 感谢您的回复。对我帮助很大
      猜你喜欢
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 2020-08-09
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多