Scala:为什么在模式匹配中允许重复声明?

时间:2017-08-15 08:18:21

标签: scala pattern-matching

似乎我们能够将模式绑定到标识符x,然后在同一范围内立即声明另一个x标识符。为什么这段代码有效?

"123" match {
  case x@"123" =>
    // I expected compilation error here, but it actually works. Even var works
    val x = "456"
    x // "456"
}

特别赞赏使用SLS等链接进行解释。

1 个答案:

答案 0 :(得分:4)

我不认为SLS中有这种情况的专门解释,但查看Pattern matching expressions部分规范,可以找到以下措辞:

  

模式匹配表达式

e match { case p_1 => b_1 … case p_n => b_n }
     

p_i中模式变量的范围包括模式的保护   和相应的块b_i。

可以理解为块b_i有自己的范围,它嵌套在模式变量的范围内。

现在,变量x绑定在模式变量范围p_i中,然后在b_i范围内重新定义。这为我们提供了嵌套作用域的情况,并且嵌套作用域中的名称阴影的常规规则也适用。