以下Scala代码可以很好地编译:
val f = (input: String) => Some("result")
object Extract {
def unapply(input: String): Option[String] = f(input)
}
val Extract(result) = "a string"但如果我将提取器替换为:
object Extract {
def unapply = f
}则编译失败,并显示以下信息:
error: an unapply result must have a member `def isEmpty: Boolean
val Extract(result) = "a string"
^为什么?def isEmpty: Boolean是从哪里来的?
发布于 2017-07-06 15:04:42
在Scala2.10(及更早版本)中,unapply必须始终返回Option或Boolean。从2.11开始,它可以返回任何类型,只要它有def isEmpty: Boolean和def get: <some type>方法(就像Option一样)。请参阅https://hseeberger.wordpress.com/2013/10/04/name-based-extractors-in-scala-2-11/以了解为什么它很有用。但是您的unapply返回了一个String => Some[String],它既没有,也没有,这就是错误所说的。
发布于 2017-07-06 02:43:00
回答你的第一个问题-- isEmpty来自Option类型的内部。
def unapply = f意味着-创建一个返回函数的无参数方法。这本身不是一个方法,因此你有一个错误。
您可以在这里进一步了解Scala中函数和方法之间的区别:Difference between method and function in Scala
https://stackoverflow.com/questions/44933669
复制相似问题