我是scala的新手并且遇到了一个模式匹配案例。
我正在编写如下模式匹配,
case class data(record:String)
def x(input:String)= input match {
case "a" => val a = data("a")
case "b" => val b = data("b")
case anythingElse = val others = ...other object creation
}
我想访问val a
之外的变量val b
,val others
和def x
。
有一种方法可以在完成对val a
的调用后返回val b
,val others
和def x
。
答案 0 :(得分:1)
您对模式匹配的理解并不完全正确,您可以在每个案例区域中指定val,但唯一的目的是做一些临时的事情。在scala中,您最后放置的任何语句都是返回值。这不能是val赋值语句,也不会返回值(也就是unit)
def x(input:String)= input match {
case "a" => data("a and something special")
case "b" =>
val temp = "b"+" Hello"
data(temp)
case other => data(other)
}
答案 1 :(得分:0)
据我了解,您正在尝试在每个case
块之外的范围中定义新变量:
case class data(record:String)
def x(input:String)= input match {
case "a" => val a = data("a")
case "b" => val b = data("b")
case anythingElse = val others = ...other object creation
}
x("a")
println(a) // should print data("a")
正确?
那不行!因为Scala"无法解析符号a"。它没有在您使用它的范围内定义。
相反,您可以使用某种数据容器(在外部作用域中定义)将其传播到外部作用域。它可以是数组,变量或Map。然而,这也将使它成为一个可变的容器。不推荐。
更好的方法是从x()
方法实际返回状态,然后使用该状态。像这样:
case class Data(record: String)
val template: Map[String, Option[Data]] = List("a", "b", "c").map(_ -> None).toMap[String, Option[Data]]
def x(input: String): Map[String, Option[Data]] = input match {
case "a" => template + ("a" -> Some(Data("a")))
case "b" => template + ("b" -> Some(Data("b")))
case anythingElse => template + ("others" -> Some(Data("others")))
}
val returnMap = x("a")
for (x <- returnMap("a")) {
println(x)
}
输出:
Data(a)
答案 2 :(得分:0)
值a
,b
和others
是每个case
的本地值;考虑一下
def x(input:String)= input match {
case "a" => (Some(data("a")), None, None)
case "b" => (None, data("b"), None)
case anythingElse = (None, None, `...other object creation`)
}
其中函数返回Option
的三元组,其中None
表示不匹配,Some(data("..."))
匹配;因此,例如
val (a,b,others) = x("a")
发送
a = Some(data("a"))
b = None
others = None