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