2016-08-29 2 views
0
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?

Большое изображение, мне нужно убедиться, что у каждого экземпляра Robot есть уникальный name - Я открыт для альтернатив использованию цикла while.

Обновление: за Джейсоном 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

Вы переопределили initName - один теней другой. –

+0

'initName' является' val'. Он не может и не меняется. 'InitName' внутри цикла while while является другой переменной. – jwvh

+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 полностью от внутренней один (так что вы не его повторного объявления).

+0

Спасибо, ваше решение исправлено. –

Смежные вопросы