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
答案 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
内在的(所以你没有重新宣布它)。