【问题标题】:Scala infinite loop [closed]Scala无限循环[关闭]
【发布时间】:2021-12-25 01:23:08
【问题描述】:

所以我是 scala 的新手,从我在网上找到的内容来看,scala 不会像其他语言那样更新变量。我正在尝试更改 while 循环中的变量,但它似乎没有改变。我有一个可变的 ArrayBuffer,它保存着键值对,声明如下:

val array1 = mutable.ArrayBuffer[Option[IndexedSeq[(K,V)]]]()

它存储基于始终为 int 的“K”值的排序数组。我正在尝试通过以下方式循环array1 的层:

var i=0
var counter = 0
while(array1(i).isDefined){
    counter += 1
    i += 1}

但是,这会导致无限循环,我怀疑 i 没有改变,我不知道为什么。

【问题讨论】:

  • 那么代码是无效的Scala 代码,尝试在Scastie 中玩,直到您可以重现您遇到的问题,然后更新问题。
  • @LuisMiguelMejíaSuárez 很抱歉习惯使用 C 语言,总是搞砸。我编辑了问题。
  • 无法重现:scastie.scala-lang.org/BalmungSan/C5w7SuU5TWyjHeTJrYIZmA/1 BTW、counteri 是多余的。 - 无论如何,使用 Scala 作为 C 的意义何在?哦,好吧,无论如何,没关系。

标签: scala while-loop infinite-loop


【解决方案1】:

当您使用 Scala 等高级语言工作时,最好忘记很多低级 C 范式。它只会误导你。

如果您有一个可迭代的事物(例如 ArrayBufferList 或任何其他模糊地暗示事物集合的事物),您可以使用迭代它

myArray.foreach { element => ... }

或者,如果你想从结果中构建一个新的集合

val myNewArray = myArray.map { element => ... }

要根据任意条件删除一些元素,请考虑

val myNewArray = myArray.filter { element => ... }

“始终将其放入while / for 循环”方法非常以 C 为中心,在 Scala 中,我们拥有大量更高级、更具表现力的工具来完成我们想做的工作。 Scala 仍然一个while 循环,但您很少需要使用它,因为有很多内置函数可以为您表达常见的循环范例。

函数式程序员可以看看

val myNewArray = myArray.map { _ + 1 }

并立即看到“啊哈,我们正在迭代并通过向每个元素添加一个新数组来创建一个新数组”,它把问题分解了很多。 C 风格的“等效”代码类似于

val myNewArray = ArrayBuffer()
var i = 0
while (i < myArray.size) {
  myNewArray += (myArray(i) + 1)
  i += 1
}

基本概念仍然是相同的:“为每个元素添加一个”,但这里还有一个 ton 需要解析以了解代码的实际想法。此代码不会立即读取“将一个添加到列表的元素”。上面写着“好吧,我们正在创建一个数组并使用一个局部变量,然后我们做了几次看起来像是在加一个......”

【讨论】:

    猜你喜欢
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 2020-04-26
    • 2012-03-15
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多