2015-03-25 24 views
0

我想知道如果這個代碼的小片段:在字符串中使用Option [string]是Scala中最乾淨的方法嗎?

val some = Some("string").getOrElse("") 
val none = None.getOrElse("") 

println(s"some $some none $none") -> some string none 

可以寫成清潔?我主要看着getOrElse部分。

我可以在字符串中使用選項而無需使用getOrElse嗎?

感謝您的輸入:)

戴維

+2

你想達到什麼目的?這個代碼可以用'val some =「string」更清晰; val none =「」;':-) – 2015-03-25 09:23:02

+0

這只是我遇到工作的一個例子,它不是一個真實的生活邏輯例子哈哈! :) – Davey 2015-03-25 09:24:17

+2

任何人都可以回答你的問題,如果他看不到代碼,代碼可以改進,所以不明白你需要改進什麼,使得更清潔? – 2015-03-25 09:27:38

回答

3

可以定義一個 「擴展方法」:

implicit class StringOptionOps(val x: Option[String]) extends AnyVal { 
    def getOrEmpty = x.getOrElse("") 
    // any other methods you want to add to Option[String] 
} 

和/或customize string interpolation作爲要處理Option S(未測試) :

implicit class StringOptionInterp(val sc: StringContext) { 
    def my(args: Any*) = { 
    val args1 = args.map { 
     case None => "" 
     case Some(x) => x 
     case x => x 
    } 
    sc.s(args1: _*) 
    } 
} 

// println(my"some ${Some("string")} none $None") -> some string none 
+0

謝謝,字符串插值定製對我來說是新的! – Davey 2015-03-25 09:51:18

+0

@JonathanCrosmer不,這將是從'Option [String]'到'String'的隱式轉換(我非常不推薦)。 – 2015-03-25 12:58:40

+0

你說得對,我誤解了代碼;抱歉! (刪除不正確的評論) – 2015-03-25 14:35:40

3

這是阿列克謝' s解決方案 - 應用pimp-my-library模式。

通過輕微濫用CanBuildFrom含義,可以編寫適用於包裝集合類型的選項的通用擴展方法orEmpty

基本上需要的是一種抓住某個包裝類型的空實例的方法。這也可以在scalaz中使用Monoid.empty來完成。 CanBuildFrom解決方案的優點是不依賴於外部依賴性。

implicit class RichOpt[A](opt: Option[A]) { 
    import collection.generic.CanBuildFrom 

    def orEmpty[To >: A](implicit cbf: CanBuildFrom[A,_,To]): To = 
     opt.getOrElse(cbf().result()) 
} 

//--------- Examples -------------- 

println("some seq: " + (None: Option[Seq[Int]]).orEmpty) 
//>some seq: List() 

println("none seq: " + (Some(Seq(1,2,3))).orEmpty) 
//>none seq: List(1, 2, 3) 


println("some range: " + (Some(1 to 3)).orEmpty) 
//>some range: Range(1, 2, 3) 

println("none range: " + (None: Option[Range]).orEmpty) 
//>none range: Vector() 


println("some string: " + Some("abc").orEmpty) 
//>some string: abc 

println("none string: " + (None: Option[String]).orEmpty) 
//>none string: 
+0

甜,我一直在發現自己在做這種事情,從來不知道它實際上是一個'模式':-) – Davey 2015-03-25 14:58:25

相關問題