Scala - 为什么::不更改List?

时间:2015-09-13 23:11:21

标签: list scala immutability

我刚刚写了这段代码以获得一些乐趣,我有一个问题,为什么它没有成功?

  val list = List[Int]()

  while (list.length < 20) {  
    Random.nextInt(100) :: list
  }

  println(list)
}

似乎没有任何内容写入列表,但为什么会这样呢?我必须让它变得可变吗?为什么::运算符无法正常运行?

1 个答案:

答案 0 :(得分:5)

由于x :: xs会返回一个新列表,其中第一个元素为x,后跟xs

因此,要使代码正常工作,请将列表设为var并在循环内重新分配:

var list = List[Int]()

while(list.length < 20)
  list = Random.nextInt(100) :: list

然而,在Scala中这样做的惯用方法是根本不使用突变(虽然局部可变状态有时很好)。 &#34;虽然&#34;循环通常可以用递归函数替换:

def go(xs: List[Int]) =
  if (xs.length >= 20) xs
  else go(Random.nextInt(100) :: xs)

go(List())

也可以使用List.fill代替

解决此特定情况
val list = List.fill(20)(Random.nextInt(100))