2013-10-04 35 views
5

我試圖找到一種簡潔的方式來格式化Scala中的選項[字符串]的字符串。我有一個標題字符串和一個字幕選項[字符串]。下面是我,但我覺得必須有一個更好的辦法:使用Scala中的選項[字符串]格式化

"Title%s".format(subtitle match 
    {case Some(s) => ": %s".format(s) 
    case None => "" }) 

所以,如果我有一個字幕,我想「標題:副標題」,但如果字幕是None,我只是想「標題」 。

+2

'subtitle.map( 「標題:%S」 .format(_))getOrElse( 「標題」)' –

+0

。像托比亞斯說的,但帶有字符串插值:字幕映射(t => s「標題:$ t」)getOrElse(「標題」) –

回答

7
subtitle map (t => s"Title: $t") getOrElse ("Title") 

字符串插值比format更安全,因爲如果你不使用正確的變量名,或missuse它在某種程度上它會在編譯時失敗。如果佔位符或其類型的數目與格式參數不匹配,則format將在運行時失敗。

您的Scala版本必須支持此功能並啓用它。

5
"Title%s".format(subtitle.map(": " + _).getOrElse("")) 

map方法與Option類型使用起來非常方便。你可以說出你想要做什麼,假設有一些價值,並且不關心如果它沒有,會發生什麼。最後,如果後者發生,你可以提供一個替代方案(在我們的例子中爲空字符串"")。

1

比你的方法更清潔一點,但是有同樣的想法。我認爲這是相當可讀:

"Title: %s" format subtitle.getOrElse("") 

順便說一句,下面的鏈接是一個很好的資源,如果你是模式上的一個選項匹配,但覺得可能有一個更好的方法:Scala Option Cheat sheet

+1

這將不起作用,因爲如果'subtitle'爲None,將產生「標題:而OP在這種情況下需要「標題」。 – siledh

0

那麼你可以使用方法:

"Title" + subtitle.fold("")(": " + _) 

但我個人仍然覺得有點冗長,所以我有一個實用工具包,我進口,其中包括

implicit class OptionRichClass[A](n: Option[A]) 
{  
    def apply[T](valNone: T, fSome: A => T): T = n.fold(valNone)(s => fSome(s)) 
    def mapList[T](f: (A) => T): List[T] = n.map[T](f(_)).toList  
    def flatList[T](f:(A) => List[T]): List[T] = n.fold(List[T]())(f(_)) 
    def flatSeq[T](f:(A) => Seq[T]): Seq[T] = n.fold(Seq[T]())(f(_)) 
} 

的申請方法是這裏最重要的一個,這將允許我這樣寫:

"Title" + subtitle("", ": " + _)