在案例类中重载 unapply 方法:scala

2024-06-20

考虑下面的代码:

case class User(id: Int, name: String)
object User{
  def unapply(str: String) = Some(User(0, str))
}

Scala 抱怨“错误:无法解析重载未应用;案例类 User(id: Int, str: String)” 不可以重载unapply吗?

更新: 不适用于较大的元组大小。

case class User(id: Int, str: String)
object User{
  def unapply(s: String) = Some((User(0, s), s, 1234))
}

编译器仍然抱怨“无法解析重载未应用”


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

它适用于

def unapply(arg: <type to match>) : Option[(<matched fields types>)]

(如果只有一个字段,则没有元组;如果没有字段,则使用布尔值而不是选项)。

User 的标准 unapply 是(Scala 语言规范第 67 页)

def unapply(u: User) = 
  if (u eq null) None 
  else Some((u.id, u.name))

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

user match {case User(name) => ....}

那将是

def unapply(u: User): Option[String] = 
  if(u eq null || u.id != 0) None 
  else Some(u.name)

如果您希望字符串可以作为用户进行匹配(这会很奇怪)

def unapply(s: String): Option[User] = Some(User(0, s))

它将与

"john" match case User(u) => ... // u is User(0, john)

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

然而,您的方法虽然作为提取器无效,但不会引起冲突。我在规范中找不到禁止它的内容。尽管如此,它还是没用,而且有用的方法也不会被允许。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在案例类中重载 unapply 方法:scala 的相关文章

随机推荐