2010-10-06 27 views

cevap

2

. Boş bir birleştirici işleç için this gönderisini görebilirsiniz.

10

Aynı semantiklerle kendiniz yazabilirsiniz - soldan sağa değerlendirme nedeniyle aynı türde ısrar eden, ancak biri bunu değiştirebilecek olan: - sağdan sola değerlendirme için gerektiğinde türlerini genişletmek:

class CoalesceNull[A <: AnyRef](a: A) { def ??(b: A) = if (a==null) b else a } 
implicit def coalesce_anything[A <: AnyRef](a: A) = new CoalesceNull(a) 

scala> (null:String) ?? (null:String) ?? "(default value)" 
res0: String = (default value) 

Ama bu operatör Option tür senaryolarda yanı sıra varolmayan değerlerin işleme birçok benzer davalara tercih edilen yoldur olabilir yok nedenini:

en az birinin boş olmadığından emin olarak head; Option(null)None dönüşür ve flatMap birlikte sadece Some(_) girdileri toplar çünkü bu işler unutmayın.)

+2

Anlamlarını aynı yapmak için 'def? (B: => A)' olması gerektiğine inanıyorum. Sanırım elvis operatörünün sağ tarafı “a” null değilse değerlendirilmemelidir. Yine de yanlış olabilir. – sinharaj

+0

@sinharaj - Muhtemelen haklısınız. C# 'nin bunu nasıl yaptığını bilmiyorum. –

3

getOrElse deneyin. Arkadaşım önerdi.

+0

Uygun bir kullanıcı değil ama basit ifadeler için kullanışlı olabilir: 'Seçenek (null: String) .getOrElse (" varsayılan değer ")' veya 'Seçenek (Option (boş değer: String) .getOrElse (null: String)). GetOrElse ("varsayılan değer") – karmakaze

2

Bağlantılı cevaba bakın, ancak, daha fazla nokta için, boş değerlerden kaçınılır. Seçenek kullan.

1

This blog post, Scala'da Groovy'un "Elvis işleci ?:" öğesinin nasıl uygulanacağını kapsar. Bu, C# 'nin ?? operatörüyle aynı şeyi yapar.