为什么我不能重复“unapply”而不重复方法签名

时间:2017-07-05 18:37:20

标签: scala extractor unapply

以下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来自哪里?

2 个答案:

答案 0 :(得分:2)

在Scala 2.10(以及之前)variable not defined必须始终返回unapplyOption。从2.11开始,它可以返回任何类型,只要它有Booleandef isEmpty: Boolean方法(如def get: <some type>那样)。请参阅https://hseeberger.wordpress.com/2013/10/04/name-based-extractors-in-scala-2-11/,了解其有用的原因。 但是您的Option会返回unapply,但也没有,这就是错误所说的内容。

答案 1 :(得分:1)

要回答您的第一个问题,isEmpty来自Option类型的内部。

def unapply = f表示 - 创建一个返回函数的无参数方法。这不是一种方法本身,因此您有一个错误。

您可以在Scala中进一步了解函数和方法之间的区别:Difference between method and function in Scala