我正在跟踪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
。
答案 0 :(得分:2)
IdGenerator(idName) = x
看起来像一个赋值,但实际上是IdGenerator.update(idName, x)
的语法糖。这说明了您收到的错误消息。
您需要使用val
关键字来提取idName
:
val IdGenerator(idName) = IdGenerator("ABC")