为什么我不能在不重复方法签名的情况下重用 "unapply"
Why can't I reuse "unapply" without repeating the method signature
以下 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
从哪里来?
回答您的第一个问题 - isEmpty
来自 Option
类型的内部构件。
def unapply = f
表示 - 创建一个 returns 函数的无参数方法。这本身不是一种方法,因此您有一个错误。
您可以在此处进一步了解 Scala 中函数和方法之间的区别:Difference between method and function in Scala
在 Scala 2.10(及之前)中,unapply
必须始终 return 一个 Option
或一个 Boolean
。从 2.11 开始,它可以 return 任何类型,只要它有 def isEmpty: Boolean
和 def get: <some type>
方法(就像 Option
那样)。请参阅 https://hseeberger.wordpress.com/2013/10/04/name-based-extractors-in-scala-2-11/ 了解它为何有用的解释。
但是你的 unapply
return 是 String => Some[String]
,两者都没有,这就是错误所说的。
以下 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
从哪里来?
回答您的第一个问题 - isEmpty
来自 Option
类型的内部构件。
def unapply = f
表示 - 创建一个 returns 函数的无参数方法。这本身不是一种方法,因此您有一个错误。
您可以在此处进一步了解 Scala 中函数和方法之间的区别:Difference between method and function in Scala
在 Scala 2.10(及之前)中,unapply
必须始终 return 一个 Option
或一个 Boolean
。从 2.11 开始,它可以 return 任何类型,只要它有 def isEmpty: Boolean
和 def get: <some type>
方法(就像 Option
那样)。请参阅 https://hseeberger.wordpress.com/2013/10/04/name-based-extractors-in-scala-2-11/ 了解它为何有用的解释。
但是你的 unapply
return 是 String => Some[String]
,两者都没有,这就是错误所说的。