为未使用的变量使用占位符时获取 MatchError

Getting MatchError when using a placeholder for an unused variable

使用 Scala 2.13.x,当我为未使用的变量使用占位符时,我得到 scala.MatchError: null

scala> object Test {
     |   val _: Any = null
     | }
object Test

scala> Test
scala.MatchError: null
  ... 41 elided

但是使用 Scala 2.12.x,我没有得到 scala.MatchError: null:

scala> object Test {
     |   val _: Any = null
     | }
defined object Test

scala> Test
res1: Test.type = Test$@784c5ef5

有什么原因吗?

scala 2.13 release notes所述:

  • Underscore is no longer a legal identifier unless backquoted (bug#10384)
    • val _ = is now a pattern match (and discards the value without incurring a warning)
  • Make extractor patterns null safe. (#6485)
    • null is treated as no match.

结合两者时,我们可以看到 Scala 2.13 的设计无法做到这一点。有关更多信息,您可以在 github 实现这两个功能的拉取请求中阅读:

下划线不再是合法标识符,除非反引号 - https://github.com/scala/bug/issues/10384

使提取器模式为 null 安全 - https://github.com/scala/scala/pull/6485