Scala 2.12:无法在提取器对象中使用取消应用

时间:2018-10-01 15:12:41

标签: scala

我正在跟踪docs.scala-lang.org上提供的Scala Tour。我陷入了提取器对象教程的困境:https://docs.scala-lang.org/tour/extractor-objects.html

这是我要编译的代码:

object IdGenerator {
  private val id: AtomicInteger = new AtomicInteger
  def apply(name: String): String = id.incrementAndGet + "--" + name
  def unapply(genID: String): Option[String] = {
    val idParts = genID.split("--")
    if (idParts.head.nonEmpty && idParts.tail.nonEmpty)
      Some(idParts(0))
    else
      None
  }
}

println(IdGenerator("ABC"))
println(IdGenerator("DEF"))
println(IdGenerator("XYZ"))

IdGenerator(idName) = IdGenerator("ABC")
println(idName)
println(IdGenerator.unapply(IdGenerator("ABC")))

这是错误:

D:\MyApps\ScalaPrac\helloworld\hello\src\main\scala\example\Hello.scala:68:5: value update is not a member of object example.IdGenerator
IdGenerator(idName) = IdGenerator("ABC")

它说值更新不是对象的成员。当然可以。但是我不是要它寻找update方法,而是要它寻找unapply

1 个答案:

答案 0 :(得分:2)

IdGenerator(idName) = x看起来像一个赋值,但实际上是IdGenerator.update(idName, x)的语法糖。这说明了您收到的错误消息。

您需要使用val关键字来提取idName

val IdGenerator(idName) = IdGenerator("ABC")