2011-08-16 12 views
91

निम्न फ़ंक्शन लें:स्कैला में पैटर्न मिलान क्यों चर के साथ काम नहीं करता है?

def fMatch(s: String) = { 
    s match { 
     case "a" => println("It was a") 
     case _ => println("It was something else") 
    } 
} 

यह पैटर्न अच्छी तरह से मेल खाता है:

scala> fMatch("a") 
It was a 

scala> fMatch("b") 
It was something else 

मैं जो करने में सक्षम होना चाहता हूं वह निम्न है:

def mMatch(s: String) = { 
    val target: String = "a" 
    s match { 
     case target => println("It was" + target) 
     case _ => println("It was something else") 
     } 
} 

यह निम्न को देता है त्रुटि:

fMatch: (s: String)Unit 
<console>:12: error: unreachable code 
       case _ => println("It was something else") 

मुझे लगता है कि ऐसा इसलिए है क्योंकि ऐसा लगता है कि लक्ष्य वास्तव में एक ऐसा नाम है जिसे आप इनपुट के लिए असाइन करना चाहते हैं। दो प्रश्न:

  1. यह व्यवहार क्यों? क्या मामला केवल उस प्रकार के मौजूदा चर के लिए नहीं दिख सकता है जिसमें उपयुक्त प्रकार है और पहले उन का उपयोग करें और यदि कोई नहीं मिला है, तो लक्ष्य को पैटर्न के रूप में पैटर्न के रूप में देखें?

  2. क्या इसके लिए कोई कामकाज है? चर के खिलाफ पैटर्न मिलान करने के लिए कोई रास्ता? आखिरकार कोई कथन के मामले में बड़ा इस्तेमाल कर सकता है, लेकिन मैच केस अधिक सुरुचिपूर्ण है।

+0

संबंधित: http://stackoverflow.com/questions/7083502/why-cant-a-variable-be-a-stable-identifier –

+0

मुझे विश्वास है कि यह प्रश्न, कोड और उत्तर स्कैला 2.12.x के रूप में पुराना है। यह अच्छा होगा अगर संस्करण लागू होता है तो प्रश्न के हिस्से के रूप में उल्लेख किया गया था। – conny

उत्तर

181

क्या आप देख रहे हैं एक स्थिर पहचानकर्ता है। स्कैला में, इन्हें या तो अपरकेस अक्षर से शुरू करना चाहिए, या बैकटिक्स से घिरा होना चाहिए।

इन दोनों अपनी समस्या के समाधान होगा:

def mMatch(s: String) = { 
    val target: String = "a" 
    s match { 
     case `target` => println("It was" + target) 
     case _ => println("It was something else") 
    } 
} 

def mMatch2(s: String) = { 
    val Target: String = "a" 
    s match { 
     case Target => println("It was" + Target) 
     case _ => println("It was something else") 
    } 
} 

चर कि पहले से ही संलग्न दायरे में ही अस्तित्व में की चर्चा करते हुए गलती से बचने के लिए, मुझे लगता है कि यह समझ में आता है कि डिफ़ॉल्ट व्यवहार लोअरकेस पैटर्न होने के लिए है चर और स्थिर पहचानकर्ता नहीं। केवल तभी जब आप ऊपरी मामले से शुरू होते हैं, या पिछली टिकों में, तो आपको यह पता होना चाहिए कि यह आसपास के दायरे से आता है।

+2

मुझे यकीन है कि यह एरलांग से आता है, जहां वैरिएबल एक पूंजी अक्षर और निचले मामले वाले प्रतीकों से शुरू होते हैं। –

+9

ध्यान दें कि 'लक्ष्य' एक मान ('val') है, और एक चर (' var') नहीं है। यह चर के साथ काम नहीं करता है। –

+0

अपरकेस? फोरट्रान के रंग कमजोर, मार्टिन, कमजोर। – Malvolio

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