2010-11-06 19 views

उत्तर

2

मुझे लगता है कि आप match (या बस बस if/else if/else) देख रहे हैं।

2
case class Paired(x: Int, y: Int) 

def foo(x: Any) = x match { 
    case string : String => println("Got a string") 
    case num : Int if num < 100 => println("Number less than 100") 
    case Paired(x,y) => println("Got x and y: " + x + ", " + y) 
    case unknown => println("??: " + unknown) 
} 

पहले दो केस स्टेटमेंट प्रकार आधारित पैटर्न मिलान दिखाते हैं। तीसरा घटक निकालने के लिए डेटा को तोड़ने और उन हिस्सों को चर के लिए असाइन करने के लिए एक्स्ट्रेक्टर का उपयोग दिखाता है। तीसरा एक चर पैटर्न पैटर्न दिखाता है जो कुछ भी मेल करेगा। नहीं दिखाया गया _ मामला है:

case _ => println("what") 

कौन सा चर पैटर्न मैच की तरह, कुछ भी मेल खाता है, लेकिन एक चर करने के लिए मिलान वस्तु बाध्य नहीं है।

शीर्ष पर केस क्लास एक निकालने वाला और कक्षा स्वयं बनाने के लिए स्कैला शॉर्टेंड है।

1

बेशक, न तो match और न ही if बिल्कुल cond जैसा ही काम करता है। एक संभावना यह इस तरह करना है:

object Cond { 
    def apply(clauses: Iterable[(()=>Boolean,()=>Any)]): Any = { 
    clauses find (_._1()) map (_._2()) getOrElse() 
    } 
} 

इस वस्तु कुछ Iterable जहां प्रत्येक आइटम बूलियन और किसी भी फ़ंक्शन फ़ंक्शन की एक जोड़ी है स्वीकार करता है। यह एक ऐसा आइटम ढूंढने का प्रयास करता है जिसका पहला फ़ंक्शन सत्य लौटाता है, यह देखता है कि यह एक पाता है या नहीं, किसी फ़ंक्शन पर दूसरा फ़ंक्शन कॉल करता है और उस फ़ंक्शन का परिणाम देता है (या() यदि कोई नहीं मिला)।

उदाहरण:

val clauses = Seq(
    ({()=>false}, {()=>println("foo")}), 
    ({()=>true}, {()=>println("bar")}) 
) 
Cond(clauses) 

def checkYear(year: Int) = { 
    Cond(Seq(
    ({()=>year % 400 == 0}, {()=>42}), 
    ({()=>true}, {()=>{c:Char => (c.toString * 3)}}) 
)) 
} 

ईटीए: हाँ, मैं यह बदसूरत है, लेकिन यह काम करता है।