为什么我不能重用“不应用”不重复的方法签名
下面的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.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
返回f
,这也没有,这就是错误所说的。
要回答你的第一个问题 - isEmpty
来自内部的Option
类型。
def unapply = f
表示 - 创建一个返回函数的无参数方法。这不是一种方法本身,因此你有一个错误。
,您可以进一步了解Scala中有函数和方法的区别:Difference between method and function in Scala
“这不是一种方法”你是什么意思? '不适用'是; 'f'不是,但它不相关。 –
@AlexeyRomanov我的意思是在这种情况下不适用不是一个f签名的方法。这是一种返回函数的方法 – greenshade
我想,我们中的一些人只是喜欢嵌套...如果是Seq [Seq [Seq [Seq [Seq [Int]]]]? – Dima