我在Scala中玩弄尝试并获取它的挂起,所以此代码示例只是学术性的。将参数传递给Scala中的增变函数
我想通过一个可变列表到一个函数,让该函数执行它的工作,然后在函数调用后,我可以使用更新列表。
var data: List[Int] = List()
// Call to function to fill a list
data = initList(data)
// Output only 0-100
data.foreach(num => if (num < 100) { println(num) })
def initList(var data: List[Int]) : List[Int] = {
for (i <- 0 to 1000)
{
data = i :: data
}
data = data.reverse
data
}
以上这一点的唯一代码不编译是在def initList()
的var
,并且因为数据是再val
我不能在功能内执行任何突变给它。
让我开始说我知道在斯卡拉,增变器通常是不被接受的,所以我不仅可以直接回答我的问题,而且可以开放更好的方法来完成它。偶尔在项目中会有一些数据从一个地方到另一个地方进行更新,但是如果您无法将数据传递给某个函数进行更改,那么有什么好的选择?
我已经通读教程和google'd为此,我假设我找不到太多关于它,因为它通常不在Scala中这样做。
这奏效了,我无法相信这个问题的答案是使一个不可改变的副本复印件可变一个可变的变量。有没有办法做到这一点没有副本?或者这被认为是Scala的标准做法? –
那么,这实际上很少复制;将“数据”声明为一个var只是你说数据指向的引用可以改变。 'inData'默认情况下基本上是一个val,所以它在生命周期中共享与'data'相同的引用(或者至少与最初传入函数的引用相同),然后initList#数据也采用同样的引用最初的参考 - 这是三件事同时具有相同的参考! - 但它不断被for循环覆盖。 – Destin
那么......还有另外一种方法吗?是的......还有其他方法,但我认为没有比这更实际的方法。它的成本非常低,它完成了你想要的。 – Destin