2015-03-29 3 views
14

समान प्रश्न: Convert match statement to partial function when foreach is used के साथ। अब इसी तरह, इंटेलिजे ने मुझे अपना कोड सुधारने के लिए कहा है। अंतर यह है, कि मैं मिलान के लिए मान का उपयोग करें:स्कैला: मैच स्टेटमेंट को पैटर्न मिलान करने वाले अज्ञात फ़ंक्शन में कनवर्ट करें - मान

val matchMe = "Foo" 
keys.foreach(key => 
    key match { 
    case `matchMe` => somethingSpecial() 
    case _ => somethingNormal(key, calcWith(key)) 
    }) 

एक गुमनाम पैटर्न मिलान समारोह को यह Refactoring कुछ ऐसा दिखाई देगा:

keys.foreach { 
    case `matchMe` => somethingSpecial(_) 
    case _ => somethingNormal(_, calcWith(_)) //this doesn't work 
} 

ध्यान दें कि दूसरे मामले में, मैं उपयोग नहीं कर सकते _ क्योंकि मुझे इसे दो बार चाहिए। क्या यहां अज्ञात पैटर्न-मिलान करने वाले फ़ंक्शन का उपयोग करने का कोई तरीका है?

उत्तर

20

आप वाइल्डकार्ड _ का उपयोग नहीं कर सकते हैं, इसका उद्देश्य यह इंगित करना है कि आप जिस मूल्य के साथ मेल खाते हैं उसके बारे में परवाह नहीं है। यह पर रख दिया गया बिना किसी प्रतिबंध के

keys.foreach { 
    case `matchMe` => somethingSpecial(matchMe) 
    case nonSpecialKey => somethingNormal(nonSpecialKey, calcWith(nonSpecialKey)) 
} 

, यह किसी भी मूल्य मिलान हो जाएगा:

आप एक नामित पैरामीटर का उपयोग कर सकते हैं। ध्यान दें कि case एस का क्रम महत्वपूर्ण है, क्योंकि case x => ... कुछ भी मेल खाता है और अनिवार्य रूप से अन्य case कथनों को शॉर्टकट करेगा।


एक के रूप में अलग रूप में, मुझे नहीं लगता कि अपने somethingSpecial(_) पड़ता कि आप क्या चाहते हैं/करने के लिए यह उम्मीद करते हैं। यह x => somethingSpecial(x) का केवल एक छोटा संस्करण है, somethingSpecial(matchMe) नहीं।

+0

'एफ (_)' x => f (x) 'है। और 'केएस foreach {case _ => f (_)}' 'ks foreach {case x => f (x)}' 'है। –

+0

अरे। वास्तव में मेरे लिए नया नहीं है .. धन्यवाद बहुत मार्थ! –

संबंधित मुद्दे