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