Scala模式匹配多个输出

时间:2016-03-21 03:02:55

标签: scala apache-spark

我是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 bval othersdef x

有一种方法可以在完成对val a的调用后返回val bval othersdef x

3 个答案:

答案 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)

abothers是每个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