首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在不重复方法签名的情况下不能重用"unapply“

为什么在不重复方法签名的情况下不能重用"unapply“
EN

Stack Overflow用户
提问于 2017-07-06 02:37:20
回答 2查看 102关注 0票数 1

以下Scala代码可以很好地编译:

代码语言:javascript
复制
val f = (input: String) => Some("result")
object Extract {
   def unapply(input: String): Option[String] = f(input)
}
val Extract(result) = "a string"

但如果我将提取器替换为:

代码语言:javascript
复制
object Extract {
   def unapply = f
}

则编译失败,并显示以下信息:

代码语言:javascript
复制
error: an unapply result must have a member `def isEmpty: Boolean
val Extract(result) = "a string"
    ^

为什么?def isEmpty: Boolean是从哪里来的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-06 15:04:42

在Scala2.10(及更早版本)中,unapply必须始终返回OptionBoolean。从2.11开始,它可以返回任何类型,只要它有def isEmpty: Booleandef get: <some type>方法(就像Option一样)。请参阅https://hseeberger.wordpress.com/2013/10/04/name-based-extractors-in-scala-2-11/以了解为什么它很有用。但是您的unapply返回了一个String => Some[String],它既没有,也没有,这就是错误所说的。

票数 3
EN

Stack Overflow用户

发布于 2017-07-06 02:43:00

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

def unapply = f意味着-创建一个返回函数的无参数方法。这本身不是一个方法,因此你有一个错误。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44933669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档