似乎我们能够将模式绑定到标识符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等链接进行解释。
答案 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
范围内重新定义。这为我们提供了嵌套作用域的情况,并且嵌套作用域中的名称阴影的常规规则也适用。