2010-08-16 9 views
13

एक स्केला समारोह है अगरमैं कैसे लौटे प्रक्रिया या तो

def A(): Either[Exception, ArrayBuffer[Int]] = { 
... 
} 

क्या लौटे परिणाम कार्रवाई करने के लिए सही तरीके से किया जाना चाहिए? val a = A() और?

+0

आप भी कर सकते हैं एक कोशिश करें [ArrayBuffer [Int]] का उपयोग करें, इसमें अपवाद भाग बनाया गया है। उस स्थिति में आपको पैटर्न मिलान करना होगा: http://www.scala-lang.org/files/archive/nightly/docs/library/index .html # scala.util.Try – Jaap

उत्तर

14

सबसे आसान तरीका मिलान

val a = A() 

a match{ 
    case Left(exception) => // do something with the exception 
    case Right(arrayBuffer) => // do something with the arrayBuffer 
} 

पैटर्न वैकल्पिक रूप से साथ है, वहाँ या तो पर काफी सरल विधियों, जो इस काम के लिए इस्तेमाल किया जा सकता है की एक किस्म। यहाँ scaladoc है http://www.scala-lang.org/api/current/index.html#scala.Either

3

एक तरह से

val a = A(); 
for (x <- a.left) { 
    println("left: " + x) 
} 
for (x <- a.right) { 
    println("right: " + x) 
} 

केवल भाव के लिए की निकायों में से एक वास्तव में मूल्यांकन किया जाएगा है।

+0

ठीक है, यह काम करता है, लेकिन मेरी राय में यह बदसूरत तरीके से 'के लिए' दुरुपयोग कर रहा है। यदि आप 'के लिए' देखते हैं, तो आप एक लूप की अपेक्षा करते हैं, लेकिन यहां इसे 'if' कथन के रूप में उपयोग किया जाता है। पैटर्न मिलान (डेव ग्रिफिथ द्वारा उत्तर देखें) बहुत साफ और समझने में आसान है। – Jesper

+2

वैसे यह निर्भर करता है। अभिव्यक्तियों के लिए स्कैला में लूपिंग की तुलना में व्यापक अर्थशास्त्र है। असल में सबकुछ जिसमें मैप/फ्लैटमैप है, का उपयोग किया जा सकता है। विकल्प के मामले में यह सुविधाजनक है यानी। – michid

32

मैं आम तौर पर fold का उपयोग करना पसंद करता हूं। आप उसे मानचित्र की तरह उपयोग कर सकते हैं:

scala> def a: Either[Exception,String] = Right("On") 

a.fold(l => Left(l), r => Right(r.length)) 
res0: Product with Either[Exception,Int] = Right(2) 

या आप एक पैटर्न मैच की तरह उपयोग कर सकते हैं:

scala> a.fold(l => { 
    | println("This was bad") 
    | }, r => { 
    | println("Hurray! " + r) 
    | }) 
Hurray! On 

या आप की तरह getOrElseOption में इसका इस्तेमाल कर सकते हैं:

scala> a.fold(l => "Default" , r => r) 
res2: String = On 
+2

मुझे यह उल्लेख करना चाहिए कि यदि आप _only_ इसे दाईं ओर मैप करने के लिए उपयोग करना चाहते हैं, तो 'a.right.map (_। Length)' कम टाइपिंग है और जो भी आप चाहते हैं वह करता है। आम तौर पर, '.right' और 'बाएं' विधियां 'किसी भी' विकल्प को पसंद नहीं करती हैं, 'विकल्प' जैसी अन्य केस के रूप में 'कोई नहीं' को संरक्षित करने के बजाय, यह किसी भी विपरीत पक्ष को संरक्षित करता है 'है इसी तरह, 'a.right.getOrElse'' fold' से सरल है। मुझे 'गुना' के बारे में क्या पसंद है यह है कि आप इन सभी चीजों को एक साथ कर सकते हैं और उन्हें गठबंधन कर सकते हैं। –

+0

right.map का उपयोग करने में समस्या यह है कि आप बाएं से बच नहीं सकते हैं (उदाहरण के लिए बाएं में कुछ सही मान बनाएं, उदाहरण के लिए यदि वे एक त्रुटि हैं)। –