[英]Scala infinite while loop even though condition changed to false
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
这是因为在您的循环中:
val initName = ...
while(nameList.names.contains(initName)){
val initName = ...
...
}
您在循环中重新声明val initName
。 因此,现在您实际上拥有两个不同的值。 while
条件是外部作用域。 在循环中声明的那个对此无效。
我实际上并不了解Scala,但是从Scala 的var和val定义之间有什么区别? 我猜解决方案是将外部的val
更改为var
(这样它是可修改的),然后将val
完全从内部的val
删除(因此您无需重新声明)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.