看来我们能够将模式绑定(bind)到标识符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 链接之类的解释。
最佳答案
我认为 SLS 中没有针对这种情况的专门解释,但请查看 Pattern matching expressions规范的一部分,可以找到以下措辞:
A pattern matching expression
e match { case p_1 => b_1 … case p_n => b_n }
The scope of the pattern variables in p_i comprises the pattern's guard and the corresponding block b_i.
可以理解为 block b_i
有自己的作用域,嵌套在模式变量的作用域中。
现在,您的变量x
已绑定(bind)在模式变量范围p_i
中,然后在b_i
范围中重新定义。这给了我们嵌套作用域的情况,并且嵌套作用域中名称隐藏的正常规则适用。
关于Scala:为什么模式匹配中允许重复声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45688995/