scala – 模式匹配和部分函数中的unapply函数有什么区别
发布时间:2020-12-16 18:13:32 所属栏目:安全 来源:网络整理
导读:我有一个从字符串中提取对象的提取器. 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 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) => } 现在,如果我尝试在部分函数中使用此提取器,编译器将失败并显示以下消息:无法解析重载的unapply val func: PartialFunction[Any,Unit] = { case ItemStructure(item) => } 如果我重命名unapply函数所在的伴随对象,则所有对象都按预期工作. 有人可以解释为什么提取物如果位于伴侣对象中不起作用? 解决方法
有两个ItemStructure.unapply方法:由case类创建的方法和您自己创建的方法.前者采用ItemStructure类型的参数,后者采用String类型的参数.
在前两个示例中,匹配对象的类型是String,因此只能应用第二个unapply方法,并且没有歧义.但是在最后一个示例中,两个unapply方法都符合条件,因此Scala不知道使用哪个方法. 如果将unapply方法放在除了伴随对象之外的其他位置,则不再有两个不适用的方法 – 只有你自己的方法(因为另一个仍然存在于伴随对象中).这样就解决了歧义:ItemStructure.unapply明确指的是自动生成的unapply和NewName.unapply明确指的是你的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |