我有ArrayBuffer
Strings
如下:
var myList = ArrayBuffer[String]()
myList += "abc"
myList += "def"
现在,我尝试根据某些条件更新String
中的ArrayBuffer
:
for(item <- myList){
if(some condition){
item = "updatedstring"
}
}
当我尝试这样做时,我收到错误消息,指出val
无法重新分配。即使我已将myList
声明为var
,为什么会出现此错误?如果我无法以这种方式更新它,那么在迭代ArrayBuffer
时我还能如何更新元素?我是Scala的新手,所以如果我弄错了,我会道歉。
答案 0 :(得分:1)
我要指出的第一件事是item
与myList
不一样 - 它是myList
中的元素,以及Scala迭代的工作方式,它是val
。有很多原因导致这种不可变性,我不会进入这里。
我建议改为:
val myNewList = myList.map(originalString =>
if (someCondition) "xyz"
else originalString
)
然后,如果你有这种倾向,你可以做myList = myNewList
(或者只是放弃完全myNewList
并做myList = myList.map(...)
)。
答案 1 :(得分:0)
在for循环item
中是本地val
。因此,它无法改变。
你可以:
遍历数组并更新每个项目
myList.zipWithIndex foreach { case (item, index) if (condition) => myList.update(index, "updated") }
或创建新的ArrayBuffer
myList = (0 until myList.length).map { index =>
val item = myList(index)
if (condition) "updated" else item
}