【问题标题】:Scala - why does :: not change a List? [duplicate]Scala - 为什么 :: 不更改列表? [复制]
【发布时间】:2015-12-09 21:36:59
【问题描述】:

我只是为了好玩才写了这段代码,我有一个问题,为什么它不起作用?

  val list = List[Int]()

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

  println(list)
}

似乎没有写入列表,但为什么会这样?我必须让它可变吗?为什么这里的:: 运算符不能正常工作?

【问题讨论】:

  • 代码实际上与:var x = 0; while (x &lt; 20) { x + 1 } .. 并确保在提出指控之前阅读文档:}

标签: list scala immutability


【解决方案1】:

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

所以,要让您的代码正常工作,请列出 var 并在循环内重新分配它:

var list = List[Int]()

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

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

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))

【讨论】:

  • @ArmaGeddon 没有问题。看看我添加的递归解决方案。在函数式编程中,递归函数优于 while 循环等。
  • 好的,非常感谢您快速而温和的帮助。是的,我当然会看看它,先生,谢谢!
猜你喜欢
  • 2017-02-20
  • 2014-10-08
  • 2020-09-24
  • 2020-04-17
  • 2015-12-30
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 2018-08-24
相关资源
最近更新 更多