簡體   English   中英

Scala無限while循環,即使條件更改為false

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM