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

Cod*_*er0 -5 scala list immutability

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

  val list = List[Int]()

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

  println(list)
}
Run Code Online (Sandbox Code Playgroud)

似乎没有任何内容写入列表,但为什么会这样呢?我必须让它变得可变吗?为什么这里的::操作员工作不正常?

dca*_*tro 5

因为x :: xs返回一个新列表,其中第一个元素是x,然后是xs.

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

var list = List[Int]()

while(list.length < 20)
  list = Random.nextInt(100) :: list
Run Code Online (Sandbox Code Playgroud)

然而,在Scala中执行此操作的惯用方法是根本不使用突变(有时局部可变状态很好)."while"循环通常可以用递归函数替换:

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

go(List())
Run Code Online (Sandbox Code Playgroud)

也可以使用List.fill替代来解决这种特定情况

val list = List.fill(20)(Random.nextInt(100))
Run Code Online (Sandbox Code Playgroud)