在尝试理解某些代码时,我遇到了奇怪的行为,并将其简化为:
在匹配中引入类型参数不起作用:
scala> Some(0) match { case _: Some[A] => 0 }
<console>:8: error: not found: type A
Some(0) match { case _: Some[A] => 0 }
^
Run Code Online (Sandbox Code Playgroud)
但是,如果我将其设为小写,它会:
scala> Some(0) match { case _: Some[a] => 0 }
res2: Int = 0
Run Code Online (Sandbox Code Playgroud)
这是Scala中的错误还是我错过了解释?
你可以在模式中看到与值变量相同的东西:
scala> Some(0) match { case A => 0 }
<console>:8: error: not found: value A
Some(0) match { case A => 0 }
^
scala> Some(0) match { case a => 0 }
res1: Int = 0
Run Code Online (Sandbox Code Playgroud)
如果要在模式中引入变量(在值或类型级别),则必须使用小写标识符 - 根本无法引入大写变量.请注意,可以向另一个方向移动 - 如果要匹配小写变量的值,可以用后引号将其包围.
从语言规范(讨论2.3中引入的更改):
模式中类型的语法已经过细化(第8.2节).Scala现在区分类型变量(以小写字母开头)和类型作为模式中的类型参数.类型变量绑定在模式中.与先前版本一样,其他类型参数已被删除.
所以不,不是一个错误,虽然它可以说是一个非常令人困惑的语言设计决定.