2012-08-17 16 views
5

मैं प्रत्येक के सामने एक ही गार्ड के साथ कई केस स्टेटमेंट करना चाहता हूं। क्या मैं इसे ऐसे तरीके से कर सकता हूं जिसके लिए कोड डुप्लिकेशन की आवश्यकता नहीं है?स्कैला पैटर्न मिलान डिफ़ॉल्ट गार्ड

class If { 
    def unapply(s: Any) = if (variable) Some(s) else None 
} 
object If extends If 
"something" match { 
    case If("a") => println("a") 
    case If("b") => println("b") 
    // ... 
} 
+1

क्या आप कोड को शाखाओं में तोड़ सकते हैं? तो "अगर परिवर्तनीय" खींचें और आपके अंदर मौजूद किसी अन्य शाखा के लिए मिलान करें? – aishwarya

उत्तर

8

आप एक निकालने बना सकते हैं एक अच्छा है वैकल्पिक रूप से आप "चर" के खिलाफ पहले मिलान कर सकते हैं:

variable match { 
    case true => s match { 
    case "a" | "b" | "c" => true 
    case _ => false 
    } 
    case _ => false 
} 
7

ऐसा लगता है या (पाइप) ऑपरेटर गार्ड की तुलना में अधिक पूर्वता है, इसलिए निम्न काम करता है:

def test(s: String, v: Boolean) = s match { 
    case "a" | "b" if v => true 
    case _ => false 
} 

assert(!test("a", false)) 
assert(test("a", true)) 
assert(!test("b", false)) 
assert(test("b", true)) 
4

0 __ के जवाब

"something" match { 
    case "a" if(variable) => println("a") 
    case "b" if(variable) => println("b") 
    // ... 
} 
संबंधित मुद्दे