首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重载case类中的unapply方法: scala

重载case类中的unapply方法: scala
EN

Stack Overflow用户
提问于 2011-10-25 13:45:09
回答 2查看 6.2K关注 0票数 6

考虑下面这段代码:

代码语言:javascript
复制
case class User(id: Int, name: String)
object User{
  def unapply(str: String) = Some(User(0, str))
}

Scala报告“错误:无法解决重载的unapply;case class User(id: Int,str: String)”不能重载unapply吗?

更新:取消应用较大的元组大小。

代码语言:javascript
复制
case class User(id: Int, str: String)
object User{
  def unapply(s: String) = Some((User(0, s), s, 1234))
}

编译器仍然报告“无法解决重载的未应用”

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-25 15:00:00

您的unapply方法无法用于模式匹配

它可以与

代码语言:javascript
复制
def unapply(arg: <type to match>) : Option[(<matched fields types>)]

(如果只有一个字段,则没有元组;如果没有字段,则为布尔值而不是Option )。

用户不适用的标准是( Scala语言规范,第67页)

代码语言:javascript
复制
def unapply(u: User) = 
  if (u eq null) None 
  else Some((u.id, u.name))

如果您想要匹配一个id为零的用户,如下所示

代码语言:javascript
复制
user match {case User(name) => ....}

那将是

代码语言:javascript
复制
def unapply(u: User): Option[String] = 
  if(u eq null || u.id != 0) None 
  else Some(u.name)

如果您希望字符串可以作为用户匹配(这将是相当奇怪的)

代码语言:javascript
复制
def unapply(s: String): Option[User] = Some(User(0, s))

它将与

代码语言:javascript
复制
"john" match case User(u) => ... // u is User(0, john)

我猜你想要前一个。在这种情况下,您的应用程序和标准方法都是具有相同参数列表(一个用户参数)的两个方法,因此它们不兼容。这可能被视为有点不幸,因为当方法作为提取器被调用时,区别元素实际上是结果元组的大小,而不是参数的类型。

然而,您的方法虽然不是有效的提取器,但不会导致冲突。我在说明书中找不到禁止它的东西。尽管如此,它仍然是无用的,一个有用的方法理所当然不会被允许。

票数 8
EN

Stack Overflow用户

发布于 2015-08-25 00:21:35

不能覆盖unapply的原因(特别是)很可能是因为它与case类的扩展对象自动创建的unapply具有相同的符号。请记住,函数的符号不会考虑其重写的返回值。

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

https://stackoverflow.com/questions/7885151

复制
相关文章

相似问题

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