2013-10-04 33 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("", ": " + _)