采取以下功能:
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")
我猜这是因为它认为目标实际上是您想要分配给任何输入的名称。两个问题:
为什么会有这种行为?不能仅在范围内查找具有适当类型的现有变量并首先使用这些变量,如果没有找到,则将目标视为要进行模式匹配的名称?有解决方法吗?有什么方法可以对变量进行模式匹配?最终可以使用一个大的 if 语句,但 match case 更优雅。
您正在寻找的是一个稳定的标识符。在 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")
}
}
为了避免意外引用封闭范围中已经存在的变量,我认为默认行为是小写模式是变量而不是稳定的标识符是有道理的。只有当您看到以大写或反引号开头的内容时,您才需要注意它来自周围的范围。
您也可以将其分配给案例内的临时变量,然后进行比较,这也可以
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")
}
}
target
是一个值 (val
),而不是一个变量 (var
)。它不适用于变量。Nil
之类的东西有很大帮助,我 打赌这才是真正的原因。this
作为稳定标识符来对其进行模式匹配,唯一的方法似乎是使用像case x if x == this =>
这样的相等保护。可能是一个语法限制,否则它应该至少在object
s 内在语义上起作用。