моему пониманию, вы пытаетесь определить новую переменную в области, которая находится за пределами каждого 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». Он не был определен в области, в которой вы его используете.
Вместо этого вы можете распространять его во внешнюю область видимости, используя какой-то контейнер данных (определенный во внешней области). Это может быть массив, переменная или карта. Однако это также сделает его изменчивым контейнером. Не рекомендуется.
Лучшим подходом было бы фактически вернуть ваше состояние от 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)