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
相关产品推荐
相关产品推荐

