1

以下 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

4

2 回答 2

3

在 Scala 2.10(及之前)unapply中,必须始终返回 aOption或 a Boolean。从 2.11 开始,它可以返回任何类型,只要它有def isEmpty: Booleandef get: <some type>方法(就像Option那样)。请参阅https://hseeberger.wordpress.com/2013/10/04/name-based-extractors-in-scala-2-11/了解它为何有用的解释。但是您的unapply返回 a String => Some[String],两者都没有,这就是错误所说的。

于 2017-07-06T07:04:42.173 回答
1

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

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

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

于 2017-07-05T18:42:59.660 回答