gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:53:19 26 4
gpt4 key购买 nike

考虑以下代码:

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

Scala 提示“错误:无法解析重载未应用;case class 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>)]

(如果只有一个字段则没有元组,如果没有字段则为 bool 值而不是选项)。

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 参数)的两种方法,因此它们不兼容。这可能被认为有点不幸,因为当方法被称为提取器时,区别元素实际上是结果元组的大小,而不是参数的类型。

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

关于scala - 在案例类 : scala 中重载 unapply 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7885151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com