首页 > 解决方案 > 生成随机名称重置失败

问题描述

以下代码适用于测试用例:

  1. 为正则表达式“[AZ]{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
}

请帮助解决这个问题

标签: scala

解决方案


尝试

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通过像这样强制重新分配来更改 's 值

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

哪个输出

val robot = new Robot()
robot.name // res0: String = OE770
robot.reset()
robot.name // res2: String = PI287

推荐阅读