2013-10-21 24 views
11

match'un yanı sıra, getOrElse'un Right veya Left değerinin gerçek içeriği için Option benzeri bir yol var mı?Her ikisini de al

scala> val x: Either[String,Int] = Right(5) 
scala> val a: String = x match { 
           case Right(x) => x.toString 
           case Left(x) => "left" 
         } 
a: String = 5 

cevap

9

Ben özellikle Either gibi ve onunla korkunç aşina değilim sonuç olarak yapmak, ama projeksiyonlar aradığınız inanıyoruz: either.left.getOrElse veya either.right.getOrElse. çıkıntılar gibi iyi comprehensions için de kullanılabileceğini

not edin. Bu düz belgelerinden bir örnek:

def interactWithDB(x: Query): Either[Exception, Result] = 
    try { 
    Right(getResultFromDatabase(x)) 
    } catch { 
    case ex => Left(ex) 
    } 

// this will only be executed if interactWithDB returns a Right 
val report = 
    for (r <- interactWithDB(someQuery).right) yield generateReport(r) 
if (report.isRight) 
    send(report) 
else 
    log("report not generated, reason was " + report.left.get) 
+3

Neden 'Either' gibi değil mi? –

+7

@Kevin Bu sadece benim kişisel görüşümdür, ancak yararlı olduğu iki durum olduğunu görüyorum: bir başarısızlık ya da başarıya geri dönmek ya da iki olası sonuçtan birini iade etmek. Birincisi bir 'Try' kullanılarak daha iyi sunulmakta ve ikincisi özensiz programlama gibi görünmektedir - eğer metodum bir' String' veya 'Date' iadesi durumunda, bazı refactoring ile yapılabilir. –

+2

Bir başarı veya başarısızlık döndürmek için bir doğrulama çerçevesinde yararlı olduğunu düşünüyorum. Genel API, daha sonra, özel durumdaki durumdaki sınıflar olduğunda bile, iade edilen istisnaların garip kullanımını önlerken, ne tür bir başarı/başarısızlık sağlayabileceğini açıkça belirtir. Şu anda üzerinde çalıştığım bir örnek, bazı doğrulamalara dayanan bir etkinlik gönderen bir etkinlik kaynağı çerçevesidir. Bunun * hissediyorum @Guillaume Bu olayın beklenen türü veya "Geçersiz olay" – Guillaume

12

left veya right projeksiyon ya üzerinde getOrElse arayarak ilgili Nicolas RINAUDO cevabı muhtemelen Option.getOrElse en yakın olanı. Aslında , kelimenin tam anlamıyla Option.getOrElse sahip olabilir: x.fold(_ => "left", r => r.toString)

Düzenleme

l gibi
scala> val x: Either[String,Int] = Right(5) 
x: Either[String,Int] = Right(5) 

scala> val a: String = x.fold(l => "left", r => r.toString) 
a: String = 5 

yukarıdaki kat kullanılmaz, ayrıca yazabilirsiniz:

Alternatif olarak, ya fold yapabilirsiniz örneğin, ya left veya right projeksiyonda toOption arayarak

012.
scala> val o: Option[Int] = x.right.toOption 
o: Option[Int] = Some(5) 

scala> val a: String = o.map(_.toString).getOrElse("left") 
a: String = 5 
0

Scala 2.12'de "doğru" değeri almak için getOrElse yöntemi vardır, ancak doğrudan "sol" değer için kullanamazsınız. Ancak, bunu şu şekilde yapabilirsiniz: e.swap.getOrElse(42).

İlgili konular