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

标签 scala pattern-matching

看来我们能够将模式绑定(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/

相关文章:

java - 在模式中使用变量

scala - 映射 [String,java.lang.Object] 到 DataFrame 架构问题

scala - 带有 IntelliJ 和 SBT 的自定义文件夹结构的 Uber jar

scala - Play 框架中的集成测试

algorithm - Boyer和Moore算法,移位表计算

android - 实时图像处理+模式匹配——openCV替代方案

斯卡拉-IntelliJ : Simple Module w/Scala SDK vs SBT-based

Scala 无限迭代器 OutOfMemory

java - 模式匹配以获取值

algorithm - 在 Haskell 的列表推导中构建列表列表