为什么Scala中的模式匹配不能和variables一起工作?

采取以下function:

def fMatch(s: String) = { s match { case "a" => println("It was a") case _ => println("It was something else") } } 

这种模式很好匹配:

 scala> fMatch("a") It was a scala> fMatch("b") It was something else 

我想能够做的是以下几点:

 def mMatch(s: String) = { val target: String = "a" s match { case target => println("It was" + target) case _ => println("It was something else") } } 

这给出了以下错误:

 fMatch: (s: String)Unit <console>:12: error: unreachable code case _ => println("It was something else") 

我想这是因为它认为目标实际上是你想分配给任何input的名字。 两个问题:

  1. 为什么这种行为? 不能只查找范围内具有适当types的现有variables,并首先使用它们,如果没有find,然后把目标作为模式匹配的名称?

  2. 有没有解决方法? 任何方式模式匹配variables? 最终可以使用一个大的if语句,但是匹配的情况更加优雅。

你正在寻找的是一个稳定的标识符 。 在斯卡拉,这些必须以大写字母开始,或反引号包围。

这两个将是解决您的问题:

 def mMatch(s: String) = { val target: String = "a" s match { case `target` => println("It was" + target) case _ => println("It was something else") } } def mMatch2(s: String) = { val Target: String = "a" s match { case Target => println("It was" + Target) case _ => println("It was something else") } } 

为了避免意外地引用已经存在于封闭范围中的variables,我认为有意义的是,默认行为是小写模式是variables而不是稳定标识符。 只有当你看到以大写字母开头的东西,或者在后面的蜱中,你是否需要意识到它来自周围的范围。