2009-10-18 16 views
126

क्या स्कैला में पैटर्न मिलान प्रणाली का उपयोग करके तुलना करना संभव है? उदाहरण के लिए:स्कैला के पैटर्न मिलान प्रणाली में तुलना ऑपरेटरों का उपयोग

a match { 
    case 10 => println("ten") 
    case _ > 10 => println("greater than ten") 
    case _ => println("less than ten") 
} 

दूसरे मामले बयान गैर कानूनी है, लेकिन मैं "जब एक से अधिक है" निर्दिष्ट करने के लिए सक्षम होने के लिए करना चाहते हैं।

+1

इसका उपयोग यह भी जांचने के लिए किया जा सकता है कि कोई फ़ंक्शन सत्य पर मूल्यांकन करता है या नहीं। 'मामला एक्स अगर x.size> 2 => ... ' – tstenner

+2

समझने की महत्वपूर्ण बात यह है कि => ऑपरेटर के बाईं ओर" पैटर्न "वास्तव में" पैटर्न "हैं। आपके पास पहली केस अभिव्यक्ति में 10 पूर्णांक अक्षर नहीं है। तो, आप बाएं तरफ ऑपरेशन नहीं कर सकते हैं (जैसे> जांच या कहें फ़ंक्शन एप्लिकेशन अजीब (_))। –

उत्तर

243

आप एक गार्ड जोड़ सकते हैं एक if और पैटर्न के बाद एक बूलियन अभिव्यक्ति यानी:

a match { 
    case 10 => println("ten") 
    case x if x > 10 => println("greater than ten") 
    case _ => println("less than ten") 
} 

संपादित करें: ध्यान दें कि यह=> के बाद एक ifडाल करने के लिए अल्पज्ञता से भी अधिक अलग है, एक है क्योंकि पैटर्न मिलान नहीं करेगा यदि गार्ड सत्य नहीं है।

+2

बेन, अच्छा जवाब, यह वास्तव में पैटर्न गार्ड के महत्व को दर्शाता है। – JeffV

25

प्रश्न की आत्मा है, जो कि कैसे एक मैच खंड में विधेय शामिल करने के लिए, इस मामले में विधेय match से पहले बाहर कारक जा सकती पूछा करने के लिए एक गैर-जवाब के रूप में:

def assess(n: Int) { 
    println(
    n compare 10 match { 
     case 0 => "ten" 
     case 1 => "greater than ten" 
     case -1 => "less than ten" 
    }) 
} 

अब, केवल the documentation for scala.math.Ordering.compare(T, T) वादे कि गैर-बराबर परिणाम से अधिक या शून्य से कम होंगे। जावा का Comparable#compareTo(T) स्कैला के समान ही निर्दिष्ट है। स्कैला के current implementation के रूप में, क्रमशः सकारात्मक और नकारात्मक मूल्यों के लिए 1 और -1 का उपयोग करने के लिए परंपरागत होता है, लेकिन कोई भी नीचे से कार्यान्वयन के कुछ जोखिम के बिना ऐसी धारणा नहीं बना सकता है।

+4

मुझे यकीन नहीं है कि क्या आप इसे वास्तविक समाधान के रूप में सुझाव दे रहे हैं, लेकिन मैं किसी भी दस्तावेज की सिफारिश करता हूं जो किसी अनियंत्रित सम्मेलन या धारणा पर निर्भर करता है। –

+1

बिल्कुल। यही कारण है कि मैंने लिखा "कोई जोखिम के बिना ऐसी धारणा नहीं बना सकता", और मेरे उत्तर को "गैर-उत्तर" के रूप में योग्यता प्राप्त की। यह विचार करना दिलचस्प है कि क्यों * 'तुलना करें()' और 'तुलना करें()' 0, 1, और -1 को उनके कोडोमेन के रूप में निर्दिष्ट न करें। – seh

+4

Math.signum (n तुलना 10) गारंटी देगा -1, 0 या 1. – richj

15

एक समाधान है कि मेरी राय में बहुत जोड़ने गार्ड की तुलना में अधिक पठनीय है:

(n compare 10).signum match { 
    case -1 => "less than ten" 
    case 0 => "ten" 
    case 1 => "greater than ten" 
} 

नोट्स:

  • Ordered.compare एक नकारात्मक पूर्णांक रिटर्न अगर यह है कि कम से कम, सकारात्मक है, तो अधिक से अधिक है, और 0 यदि बराबर है।
  • Int.signum एक ऋणात्मक संख्या (10 से कम), 1 के लिए सकारात्मक (से अधिक 10) के लिए -1 को compare से उत्पादन, या शून्य के लिए 0 (10 के बराबर) संपीड़ित करता है।
संबंधित मुद्दे