[英]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.