2016-03-21 77 views
0

我是scala新手,遇到一種模式匹配的情況。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 aval bval othersdef x的。

有沒有辦法在def x的呼叫完成後返回val a,val bval others

回答

1

您對模式匹配的理解並不完全正確,您可以在每個案例區域指定vals,但唯一的目的是臨時執行某些操作。在scala中,你最後放置的任何語句都是返回值。這不可能是一個VAL賦值語句,或沒有價值(又名單位)將返回

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」。它沒有在您使用它的範圍內定義。

相反,您可以使用某種數據容器(在外部作用域中定義)將其傳播到外部作用域。它可以是一個數組,一個變量或一個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) 
} 

OUTPUT:

Data(a) 
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