मुझे लगता है कि आपको लिफ्ट के Box का उपयोग करने से लाभ हो सकता है, जिसमें Full
(यानी Some
), Empty
(यानी। None
) और Failure
(एक Empty
एक कारण के साथ यह खाली है और इसे जंजीर किया जा सकता है)। डेविड पोलक के पास good blog post है जो इसे पेश करता है। यह मूल उदाहरण के अलावा कोई कम नहीं है बल्कि यह एक थोड़ा और अधिक तार्किक है मेरी राय में, एक सफल सत्यापन के परिणाम के साथ
def validate1: Box[String]
def validate2: Box[String]
def validate3: Box[String]
val validation = for (
validation1 <- validate1 ?~ "error message 1"
validation2 <- validate2 ?~ "error message 2"
validation3 <- validate3 ?~ "error message 3"
) yield "overall success message"
: संक्षेप में, आप कुछ इस तरह (परीक्षण नहीं) कर सकते हैं Full
में और Failure
में एक विफल सत्यापन।
हालांकि, हम छोटे हो सकते हैं। सबसे पहले, के बाद से हमारे सत्यापन समारोह लौट Box[String]
, वे Failure
खुद को एस लौट सकते हैं और हम Failure
को Empty
को बदलने की जरूरत नहीं है अपने आप को:
val validation = for (
validation1 <- validate1
validation2 <- validate2
validation3 <- validate3
) yield "overall success message"
लेकिन, Box
भी एक or
विधि है कि एक ही Box
अगर यह रिटर्न है Full
या अन्य Box
है यदि यह नहीं है। यह हमें देना होगा:
वैल सत्यापन = validate1 या validate2 या validate3
हालांकि, उस लाइन पहले मान्यता सफलता, नहीं पहले विफलता पर रुकती है। यह एक और तरीका बनाने के लिए समझ में आता है जो आप चाहते हैं (शायद unless
कहा जाता है?) हालांकि मैं यह नहीं कह सकता कि यह वास्तव में समझ दृष्टिकोण के मुकाबले ज्यादा उपयोगी होगा।
हालांकि, यहां एक छोटे से पुस्तकालय रोगी कि करता है यह:
scala> class Unless[T](a: Box[T]) {
| def unless(b: Box[T]) = {
| if (a.isEmpty) { a }
| else b
| }
| }
defined class Unless
scala> implicit def b2U[T](b: Box[T]): Unless[T] = new Unless(b)
b2U: [T](b: net.liftweb.common.Box[T])Unless[T]
scala> val a = Full("yes")
a: net.liftweb.common.Full[java.lang.String] = Full(yes)
scala> val b = Failure("no")
b: net.liftweb.common.Failure = Failure(no,Empty,Empty)
scala> val c = Full("yes2")
c: net.liftweb.common.Full[java.lang.String] = Full(yes2)
scala> a unless b
res1: net.liftweb.common.Box[java.lang.String] = Failure(no,Empty,Empty)
scala> a unless b unless c
res2: net.liftweb.common.Box[java.lang.String] = Failure(no,Empty,Empty)
scala> a unless c unless b
res3: net.liftweb.common.Box[java.lang.String] = Failure(no,Empty,Empty)
scala> a unless c
res4: net.liftweb.common.Box[java.lang.String] = Full(yes2)
यह एक त्वरित स्काला के प्रकार प्रणाली की मेरी समझ सीमित पर आधारित हैक है के रूप में आपको निम्न त्रुटि में देख सकते हैं:
scala> b unless a
<console>:13: error: type mismatch;
found : net.liftweb.common.Full[java.lang.String]
required: net.liftweb.common.Box[T]
b unless a
^
हालांकि, यह आपको सही रास्ते पर लाने के लिए पर्याप्त होना चाहिए।
बेशक Lift ScalaDocs पर Box पर अधिक जानकारी है।
अंतिम पंक्ति एक छोटा सा सरल किया जा सकता है: '(validate1 ++ validate2 ++ validate3) – pr1001
मुझे नहीं लगता कि आप करना चाहते हैं .head' '.iterator' कॉल ड्रॉप करें - फिर आप केवल कॉलिंग विधियों के बजाय सभी वैध विधियों को कॉल करेंगे जब तक कि उनमें से कोई एक त्रुटि नहीं देता है। – Steve
आह, मैं देखता हूं, बहुत स्मार्ट। – pr1001