2013-10-04 16 views
5

Próbuję znaleźć zwięzły sposób sformatowania String za pomocą opcji [String] w Scali. Mam tytuł String i podtytuł Option [String]. Oto co mam, ale czuję się jak tam musi być lepszy sposób:Formatowanie za pomocą opcji [String] w Scali

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

Więc jeśli mam napisów, chcę „Tytuł: Napisy”, ale jeśli napisów jest None, po prostu chcę „title” .

+2

'subtitle.map ("Tytuł:% s" .format (_)) getOrElse ("Title")' –

+0

. Tak jak powiedział Tobiasz, ale z interpolacją ciągów znaków: mapa napisów (t => s "Tytuł: $ t") getOrElse ("Tytuł") –

Odpowiedz

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

interpolacja String jest bardziej bezpieczny niż format bo jeśli nie używają poprawnej nazwy zmiennej lub missuse go jakoś nie powiedzie się w czasie kompilacji. format zawiedzie w czasie wykonywania, jeśli liczba symboli zastępczych lub ich typy nie są zgodne z argumentami formatu.

Twoja wersja Scala musi obsługiwać tę funkcję i mieć ją włączoną.

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

map metoda jest bardzo wygodne w użyciu typu Option. Możesz powiedzieć, co chcesz zrobić, zakładając, że jest tam pewna wartość, i nie przejmuj się, co się stanie, jeśli nie będzie. Na koniec wystarczy podać alternatywę, jeśli wystąpił drugi (w naszym przypadku pusty Ciąg "").

1

Trochę czystsze niż twoje podejście, ale ten sam pomysł. Myślę, że to jest dość czytelna:

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

Tak na marginesie, ten Link jest doskonałym źródłem informacji, jeśli jesteś wzorzec dopasowania na opcja, ale myślę, że prawdopodobnie jest to lepszy sposób: Scala Option Cheat sheet

+1

To nie zadziała, ponieważ wytworzy "Tytuł:" jeśli "podtytułem" jest Brak, a PO chciał w tym przypadku "tytułu". – siledh

0

Cóż mógłbyś używać:

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

ale osobiście jeszcze okazać, że trochę rozwlekły więc mam pakiet narzędzi, które importować który obejmuje

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(_)) 
} 

Zastosuj metodę jest ważne tutaj, które pozwoliłyby mi napisać:

"Title" + subtitle("", ": " + _) 
Powiązane problemy