我有这个代码UniqueKeyGenerator,有一个可变的变量号要逐步添加,因为我想让生成的值可预测,我想知道如何将其更改为值而不是变量
object UniqueKeyGenerator {
var number = 0
def generate(suiteClass: Class[_]): String = {
number = number + 1
suiteClass.getCanonicalName + "." + this.number
}
}
非常感谢提前
答案 0 :(得分:3)
如果您只是尝试用val
代替var
来表达此问题,则可以使用Iterator
。
object UniqueKeyGenerator {
val numbers = Iterator.iterate(0)(_ + 1)
def generate(suiteClass: Class[_]): String =
s"${suiteClass.getCanonicalName}.${numbers.next()}"
}
否则,我不确定你问的是什么 - 可能会提供更多背景信息?
如果您预先拥有所有输入,那么您可以编写如下内容:
Seq(classOf[String], classOf[Int], classOf[String]).zipWithIndex
.map({ case (suiteClass, i) => s"${suiteClass.getCanonicalName}.$i" })
// res: List(java.lang.String.0, int.1, java.lang.String.2)
答案 1 :(得分:1)
除了Iterator之外,您还可以使用闭包,例如,如果要生成的id不仅仅是下一个自然数,而是表达式更复杂的结果。
val nextId = {
var id = 0
() => {
id = id + 1 // change it to something more complex if you like
id
}
}
此处的“id”仍然是变量,但无法从外部访问。您可以使用它的唯一方法是调用nextId:
def generate(suiteClass: Class[_]): String = {
suiteClass.getCanonicalName + "." + nextId()
}