加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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明确指的是你的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读