gpt4 book ai didi

scala - 模式匹配和偏函数中的 unapply 函数有什么区别

转载 作者:行者123 更新时间:2023-12-05 00:14:41 25 4
gpt4 key购买 nike

我有一个从字符串中提取对象的提取器。

case class ItemStructure(id: String, data: String)
object ItemStructure {
def unapply(str: String): Option[ItemStructure] = {
str.split('-').toList match {
case List(id, data) => Some(ItemStructure(id, data))
case _ => None
}
}
}

如果我尝试在模式匹配中使用这个提取器,那么一切都会按预期工作。
"" match {
case ItemStructure(item) =>
}

它也适用于模式匹配匿名函数。
Option("").map {
case ItemStructure(item) =>
}

现在,如果我尝试在部分函数中使用此提取器,编译器将失败并显示以下消息:无法解析重载未应用
val func: PartialFunction[Any, Unit] = {
case ItemStructure(item) =>
}

如果我重命名 unapply 函数所在的伴随对象,那么一切都会按预期工作。

如果提取物位于伴随对象中,有人可以解释为什么提取物不起作用吗?

最佳答案

有两个ItemStructure.unapply方法:由案例类创建的方法和您自己创建的方法。前者采用 ItemStructure 类型的参数后者采用 String 类型的参数.

在前两个示例中,匹配对象的类型是 String ,所以只有第二个 unapply方法可以应用,没有歧义。但在最后一个例子中,unapply方法是合格的,所以 Scala 不知道使用哪一个。

如果你把你的 unapply除了伴随对象之外的其他方法,不再有两个 unapply方法 - 只有你的(因为另一个仍然存在于伴生对象中)。这样就解决了歧义:ItemStructure.unapply显然是指自动生成的 unapplyNewName.unapply显然是指你的。

关于scala - 模式匹配和偏函数中的 unapply 函数有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46488352/

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