2013-10-21 5 views
11

match का उपयोग करने के अलावा, पर Right या Left मान की वास्तविक सामग्री का विकल्प है?या तो

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 

उत्तर

9

मैं नहीं विशेष रूप से Either की तरह है और इसके परिणामस्वरूप मैं इसके साथ बहुत परिचित नहीं हूँ के रूप में करते हैं, लेकिन मेरा मानना ​​है कि आप अनुमानों की तलाश कर रहे: either.left.getOrElse या either.right.getOrElse

ध्यान दें कि अनुमानों के लिए अनुमानों का भी उपयोग किया जा सकता है। यह सीधे दस्तावेज़ से एक उदाहरण है:

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

आपको 'या तो' क्यों पसंद नहीं है? –

+7

@ केविन यह मेरी व्यक्तिगत राय है, लेकिन मुझे लगता है कि दो मामले हैं जहां यह उपयोगी है: विफलता या सफलता वापस करने के लिए, या दो संभावित परिणामों में से एक को वापस करने के लिए। पूर्व को 'ट्राई' का उपयोग करके बेहतर सेवा दी जाती है और बाद वाला मैला ही प्रोग्रामिंग की तरह लगता है - मुझे लगता है कि अगर मेरी विधि या तो 'स्ट्रिंग' या 'डेट' वापस कर सकती है, उदाहरण के लिए, यह कुछ रिफैक्टरिंग के साथ कर सकती है। –

+2

मुझे लगता है कि यह सफलता या विफलता वापस करने के लिए एक सत्यापन ढांचे में उपयोगी है। सार्वजनिक एपीआई तब स्पष्ट रूप से आपको बताएगी कि किस प्रकार की सफलता/विफलता वापस आ सकती है, भले ही वे कस्टम स्टेटफुल क्लास हों, जबकि चेक अपवादों के अजीब उपयोग से परहेज करें। एक उदाहरण जो मैं वर्तमान में काम कर रहा हूं वह एक इवेंट-सोर्सिंग फ्रेमवर्क है, जो कुछ सत्यापन के आधार पर एक ईवेंट प्रेषित करेगा। यह या तो अपेक्षित प्रकार की घटना हो सकती है, या किसी प्रकार का "अमान्य घटना" – Guillaume

12

या तो left या right प्रक्षेपण पर getOrElse बुला के बारे में निकोलस Rinaudo का जवाब शायद Option.getOrElse के सबसे करीब है।

वैकल्पिक रूप से, आप fold कर सकते हैं या तो:

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 

l जैसा कि ऊपर गुना में नहीं किया जाता है, तो आप भी लिख सकता है x.fold(_ => "left", r => r.toString)

संपादित करें: असल में, आप सचमुच Option.getOrElse हो सकता है toOption पर left या right पर प्रक्षेपण करके, उदाहरण के लिए,

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

स्कैला 2.12 में "दाएं" मान प्राप्त करने के लिए getOrElse विधि है लेकिन आप इसे सीधे "बाएं" मान के लिए उपयोग नहीं कर सकते हैं। हालांकि, आप इसे इस तरह से कर सकते हैं: e.swap.getOrElse(42)

संबंधित मुद्दे