我刚刚写了这段代码以获得一些乐趣,我有一个问题,为什么它没有成功?
val list = List[Int]()
while (list.length < 20) {
Random.nextInt(100) :: list
}
println(list)
}
似乎没有任何内容写入列表,但为什么会这样呢?我必须让它变得可变吗?为什么::
运算符无法正常运行?
答案 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))