2016-03-21 4 views
0

Я новичок в scala и застрял в одном корпусе.Scala Pattern, соответствующий нескольким выходам

я пишу по шаблону, как показано ниже,

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 завершена.

ответ

1

Ваше понимание соответствия шаблонов не совсем корректно, вы можете назначить vals в каждой области случая, но единственной целью этого было бы сделать что-то временное. В scala любое утверждение, которое вы ставите последним, является возвращаемым значением. Это не может быть Вэл оператор присваивания, или нет значения (так называемый блок) будет возвращен

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) 
} 
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». Он не был определен в области, в которой вы его используете.

Вместо этого вы можете распространять его во внешнюю область видимости, используя какой-то контейнер данных (определенный во внешней области). Это может быть массив, переменная или карта. Однако это также сделает его изменчивым контейнером. Не рекомендуется.

Лучшим подходом было бы фактически вернуть ваше состояние от 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) 
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 
Смежные вопросы