Scala无限循环,即使条件更改为false

时间:2016-08-29 01:42:50

标签: scala while-loop infinite-loop

import scala.collection.mutable.ArrayBuffer

object nameList {
    val names = ArrayBuffer("placeholder")
}

class Robot {
  val r = scala.util.Random
  val letters = 'A' to 'Z'
  val name = {
    val initName = nameList.names(0)
    while(nameList.names.contains(initName)){
        val initName = letters(r.nextInt(26)).toString + letters(r.nextInt(26)).toString + r.nextInt(10).toString + r.nextInt(10).toString + r.nextInt(10).toString
        println("while", initName)
        println("while", nameList.names)
        println("checker", nameList.names.contains(initName))
    }
    println("outside", nameList.names)
    nameList.names += initName
    initName
  }
}

输出

(while,LA079)
(while,ArrayBuffer(placeholder))
(checker,false)
(while,IO176)
(while,ArrayBuffer(placeholder))
(checker,false)

while循环无限期运行,上面是输出片段。为什么即使条件变为false,while循环也不会退出?

总体而言,我需要确保每个Robot个实例都有一个独特的name - 我可以选择使用while循环。

更新:根据Jason C,下面的代码修复了重新分配问题:

var initName = nameList.names(0)
    while(nameList.names.contains(initName) == true){
        initName = letters(r.nextInt(26)).toString + letters(r.nextInt(26)).toString + r.nextInt(10).toString + r.nextInt(10).toString + r.nextInt(10).toString

1 个答案:

答案 0 :(得分:3)

这是因为在你的循环中:

val initName = ...
while(nameList.names.contains(initName)){
    val initName = ...
    ...
}

您在循环中重新声明val initName。所以现在你实际上有两个不同的值。 while条件中的那个是外部范围的。在循环中声明的那个对它没有影响。

我实际上并不知道Scala,但是来自What is the difference between a var and val definition in Scala?我猜测解决方案是将外部更改为var(因此可以修改)并完全删除val内在的(所以你没有重新宣布它)。