You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala样例类unapply方法返回值不符合预期的疑问

关于Scala case class unapply方法返回值的疑问

代码复现

❯ scala-cli -j system -S 3.3.4
Welcome to Scala 3.3.4 (21.0.5, Java OpenJDK 64-Bit Server VM).
Type in expressions for evaluation. Or try :help.

scala> case class Point(x:Int,y:Int)
// defined case class Point

scala> val p = Point(1,2)
val p: Point = Point(1,2)

scala> Point.unapply(p)
val res0: Point = Point(1,2)

疑问

阅读过相关技术文章及Scala官方Extractor Objects文档后,预期Point.unapply()应返回Option[(Int, Int)](例如Some((1, 2))),而非返回原实例的恒等函数,请问理解存在哪些误区?


解答

你的误区核心是混淆了Scala 2和Scala 3中case class自动生成的unapply方法的设计差异:

  • 在Scala 2中,case class会自动生成返回Option[(Int, Int)]的unapply方法,这是当时提取器的标准接口,用于适配通用模式匹配逻辑。
  • 而Scala 3为了优化模式匹配性能、简化底层实现,对case class的unapply做了针对性调整:自动生成的unapply是一个身份提取器,直接返回原实例本身(类型为Point => Point)。编译器在处理模式匹配时,会直接基于这个提取器完成解构操作,不需要额外的Option包装。

如果确实需要获取Option[(Int, Int)]格式的返回结果,可以手动实现自定义提取器方法:

case class Point(x: Int, y: Int)

object Point {
  def unapply(p: Point): Option[(Int, Int)] = Some((p.x, p.y))
}

val p = Point(1, 2)
Point.unapply(p) // 返回 Some((1,2))

内容的提问来源于stack exchange,提问作者david.perez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:03:21