如何更改可变增量编号才能正常工作

时间:2014-10-14 00:41:13

标签: scala

我有这个代码UniqueKeyGenerator,有一个可变的变量号要逐步添加,因为我想让生成的值可预测,我想知道如何将其更改为值而不是变量

object UniqueKeyGenerator {

  var number = 0

  def generate(suiteClass: Class[_]): String = {
    number = number + 1
    suiteClass.getCanonicalName + "." + this.number
  }
}

非常感谢提前

2 个答案:

答案 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()
}