2009-09-01 9 views
20

Po obejrzeniu odpowiedzi z pytań takich jak: this one z udziałem pokazów grozy, takich jak próba złapania NPE i wyszukania zniekształconego nazwiska ze śladu stosu, zadaję to pytanie, aby móc odpowiedzieć na to pytanie.Jak napisać prawidłowy bezpiecznik koalescencyjny w scali?

Komentarze lub dalsze usprawnienia mile widziane.

+3

Trzeba odpowiedział na to pytanie, zamiast tworzyć nowy. Lub, być może, oprócz. –

+3

Jeśli tak powiesz. Kiedy odpowiadam na pytanie więcej niż około 24 godziny po jego zadaniu, odpowiedź pozostaje niewyraźna, niezależnie od jego względnej wartości (i biorąc pod uwagę, że tylko odpowiadam na pytania scala, mam pewne pojęcie o wartości mojej odpowiedzi.) – extempore

+0

dzięki, to było horror, aby zobaczyć rozwiązanie, które obejmuje wyjątki. chyba że chcesz spowolnić aplikację o kilka rzędów wielkości. – smartnut007

Odpowiedz

33

tak:

case class ?:[T](x: T) { 
    def apply(): T = x 
    def apply[U >: Null](f: T => U): ?:[U] = 
    if (x == null) ?:[U](null) 
    else ?:[U](f(x)) 
} 

I w akcji:

scala> val x = ?:("hel")(_ + "lo ")(_ * 2)(_ + "world")() 
x: java.lang.String = hello hello world 

scala> val x = ?:("hel")(_ + "lo ")(_ => (null: String))(_ + "world")() 
x: java.lang.String = null 
+0

to jest naprawdę całkiem fajne – jpswain

+8

Czekałem siedem lat, aby ktoś zrobił tę obserwację! Dzięki. – extempore