采取以下功能:
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")
我想这是因为它认为目标实际上是一个你想要分配给输入的名称。两个问题:
为什么会这样?不能只是在范围内查找具有适当类型的现有变量并首先使用它们,如果没有找到,则将target作为模式匹配的名称处理?
有解决方法吗?任何模式匹配变量的方法?最终可以使用大的if语句,但匹配情况更优雅。
答案 0 :(得分:198)
您正在寻找的是稳定标识符。在Scala中,这些必须以大写字母开头,或者用反引号包围。
这两种方法都可以解决您的问题:
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")
}
}
为了避免意外引用封闭范围中已存在的变量,我认为默认行为是将小写模式变为变量而不是稳定标识符。只有当你看到以大写字母或后面的标记开头的东西时,你是否需要知道它来自周围的范围。
答案 1 :(得分:1)
你也可以把它赋给case里面的一个临时变量然后比较一下,这样也行
def mMatch(s: String) = {
val target: String = "a"
s match {
case value if (value ==target) => println("It was" + target) //else {} optional
case _ => println("It was something else")
}
}