एक स्केला समारोह है अगरमैं कैसे लौटे प्रक्रिया या तो
def A(): Either[Exception, ArrayBuffer[Int]] = {
...
}
क्या लौटे परिणाम कार्रवाई करने के लिए सही तरीके से किया जाना चाहिए? val a = A()
और?
एक स्केला समारोह है अगरमैं कैसे लौटे प्रक्रिया या तो
def A(): Either[Exception, ArrayBuffer[Int]] = {
...
}
क्या लौटे परिणाम कार्रवाई करने के लिए सही तरीके से किया जाना चाहिए? val a = A()
और?
सबसे आसान तरीका मिलान
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
एक तरह से
val a = A();
for (x <- a.left) {
println("left: " + x)
}
for (x <- a.right) {
println("right: " + x)
}
केवल भाव के लिए की निकायों में से एक वास्तव में मूल्यांकन किया जाएगा है।
ठीक है, यह काम करता है, लेकिन मेरी राय में यह बदसूरत तरीके से 'के लिए' दुरुपयोग कर रहा है। यदि आप 'के लिए' देखते हैं, तो आप एक लूप की अपेक्षा करते हैं, लेकिन यहां इसे 'if' कथन के रूप में उपयोग किया जाता है। पैटर्न मिलान (डेव ग्रिफिथ द्वारा उत्तर देखें) बहुत साफ और समझने में आसान है। – Jesper
वैसे यह निर्भर करता है। अभिव्यक्तियों के लिए स्कैला में लूपिंग की तुलना में व्यापक अर्थशास्त्र है। असल में सबकुछ जिसमें मैप/फ्लैटमैप है, का उपयोग किया जा सकता है। विकल्प के मामले में यह सुविधाजनक है यानी। – michid
मैं आम तौर पर 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
या आप की तरह getOrElse
Option
में इसका इस्तेमाल कर सकते हैं:
scala> a.fold(l => "Default" , r => r)
res2: String = On
मुझे यह उल्लेख करना चाहिए कि यदि आप _only_ इसे दाईं ओर मैप करने के लिए उपयोग करना चाहते हैं, तो 'a.right.map (_। Length)' कम टाइपिंग है और जो भी आप चाहते हैं वह करता है। आम तौर पर, '.right' और 'बाएं' विधियां 'किसी भी' विकल्प को पसंद नहीं करती हैं, 'विकल्प' जैसी अन्य केस के रूप में 'कोई नहीं' को संरक्षित करने के बजाय, यह किसी भी विपरीत पक्ष को संरक्षित करता है 'है इसी तरह, 'a.right.getOrElse'' fold' से सरल है। मुझे 'गुना' के बारे में क्या पसंद है यह है कि आप इन सभी चीजों को एक साथ कर सकते हैं और उन्हें गठबंधन कर सकते हैं। –
right.map का उपयोग करने में समस्या यह है कि आप बाएं से बच नहीं सकते हैं (उदाहरण के लिए बाएं में कुछ सही मान बनाएं, उदाहरण के लिए यदि वे एक त्रुटि हैं)। –
आप भी कर सकते हैं एक कोशिश करें [ArrayBuffer [Int]] का उपयोग करें, इसमें अपवाद भाग बनाया गया है। उस स्थिति में आपको पैटर्न मिलान करना होगा: http://www.scala-lang.org/files/archive/nightly/docs/library/index .html # scala.util.Try – Jaap