我想将一个成员添加到列表中,但列表是不可变的。有人告诉我,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
}
}
}
答案 0 :(得分:0)
您可以使用名为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?了解详情。
答案 1 :(得分:0)
您的head
方法无法满足您的期望。
add
会返回一个新列表,其中添加了额外成员。但是,您明确地丢弃了它的类型为List [T]的返回值。也就是说,在列表中添加元素不会修改列表:它只返回一个新的不可变List。
你可能想要的东西是:
member :: this.list
但是,通常情况下,如果你想坚持功能性方法,你想避免副作用。
答案 2 :(得分:0)
如果你想拥有一切不可变的东西,你应该创建新的Family实例,因为在其他情况下,Family的实例是可变的
class Family[T](list: List[T] = List()){
def add(member: T): Unit = new Family(member :: this.list)
}
如果家庭是一个比使用可变集合更好的东西。如果它不是构建者,请查看它的用法,可能您根本不需要“添加”方法。