Сгенерировать случайное имя не удается при сбросе - PullRequest
0 голосов
/ 30 июня 2019

Приведенный ниже код отлично работает для тестовых случаев:

  1. имя генерируется для регулярного выражения "[A-Z] {2} \ d {3}"
  2. имя не изменено
  3. не имеет того же имени, что и другие роботы

, но сбой сброса

  1. Может быть сброшено его имя.

Контрольный пример:

val robot = new Robot()
val name = robot.name
robot.reset()
val name2 = robot.name
name should not equal name2

Исходный код:

class Robot {
  val chars = ('A' to 'Z' )
  var name : String = {
    var num = 100 + Random.nextInt(899)
    var sb = new StringBuilder
    for (i <- 1 to 2 ) {
        sb.append(chars(scala.util.Random.nextInt(chars.length)))
    }
    sb.append(num)
    sb.toString()
  }

  def reset() : String = new Robot().name
}

Пожалуйста, помогите исправить это

1 Ответ

1 голос
/ 30 июня 2019

Попробуйте

class Robot {
  var name : String = randomName()

  def randomName() = {
    val chars = ('A' to 'Z' )
    var num = 100 + Random.nextInt(899)
    var sb = new StringBuilder
    for (i <- 1 to 2 ) {
      sb.append(chars(scala.util.Random.nextInt(chars.length)))
    }
    sb.append(num)
    sb.toString()
  }

  def reset(): String = {
    name = randomName()
    name
  }
}

Обратите внимание, что name не изменяется при последующем доступе, несмотря на то, что ему назначен метод var name : String = randomName():

val robot = new Robot()
robot.name // res0: String = RV417
robot.name // res1: String = RV417
robot.name // res2: String = RV417

Это потому, что varзначение запоминается, то есть оно кэшируется после первой инициализации.Тем не менее, мы все еще можем изменить значение var, принудительно переназначая его так:

def reset(): String = {
  name = randomName()
  name
}

, который выдает

val robot = new Robot()
robot.name // res0: String = OE770
robot.reset()
robot.name // res2: String = PI287
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...