2013-11-22 80 views
0

我想實現類似如下:斯卡拉:模式匹配多個選項參數

private def msgPrefix(implicit myClass: MyClass, anotherClass: AnotherClass) = {   
    Option(myClass, anotherClass) match { 
     case Some(validMyClass, validAnotherClass) => validMyClass.process + validAnotherClass.process 
     case _  => "" 
    } 
    } 

什麼是做到這一點的正確方法?

回答

3

我不知道我的理解,你在找什麼,但:

private def msgPrefix(implicit myClass: MyClass, anotherClass: AnotherClass) = {   
    (Option(myClass), Option(anotherClass)) match { 
    case (Some(validMyClass), Some(validAnotherClass)) => validMyClass.process + validAnotherClass.process 
    case _ => "" 
    } 
} 

這將返回空字符串,如果兩個參數中至少有一個是空的,即:

scala> msgPrefix(MyClass("foo"),null) 
res2: String = "" 

scala> msgPrefix(MyClass("foo"),AnotherClass("bar")) 
res3: String = foobar 

但你可能應該只改變的參數類型Option[MyClass]Option[AnotherClass](如果可以的話)。

2

我馬斯同意你的論點也許應該Option[MyClass]Option[AnotherClass]。但是,爲了回答你原來的問題,你可以使用的理解,而不是模式匹配:

private def msgPrefix(implicit myClass: MyClass, anotherClass: AnotherClass) = { 
    val prefix = for { 
    validMyClass <- Option(myClass) 
    validAnotherClass <- Option(anotherClass) 
    } yield validMyClass.process + validAnotherClass.process 
    prefix.getOrElse("") 
} 
+0

我真的很喜歡這個解決辦法,但我接受@Marth的答案,這也正是我一直在尋找。 – Prasanna