scala - 生成随机名称重置失败
问题描述
以下代码适用于测试用例:
- 为正则表达式“[AZ]{2}\d{3}”生成名称
- 名字没有改变
- 与其他机器人名称不同
但重置失败
- 可以重置其名称。
测试用例:
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
}
请帮助解决这个问题
解决方案
尝试
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
推荐阅读
- unity3d - Unity使用着色器进行水效果,但我需要着色器三角形的法线和位置而不是网格
- javascript - 在 javascript 类中,如何让一个方法从另一个方法继承?
- ios - iPhone 11 上的 SafeAreaView 实施
- mysql - 不使用视图左连接
- algorithm - 当计算机速度加倍时计算 O(n)
- javascript - 谷歌日历 API 条件
- tensorflow - 参数必须是 1 个整数的元组。收到或类型错误:int() 参数必须是字符串、类似字节的对象或数字,而不是“列表”
- python - 网页抓取有问题
- javascript - Django url 错误(重定向到另一个 url)
- c++ - 使用 CaptureSharedEventDriven 录制音频未设置时间