2011-07-03 9 views
7

में बैकक्वोट का उपयोग किया गया है, मैं स्कैला में नया हूं और स्काला में स्विंग काम करने के लिए उदाहरणों में से एक का पालन करता हूं और मैं एक प्रश्न पूछता हूं। , के आधार परस्कैला स्विंग इवेंट

listenTo(celsius, fahrenheit) 
    reactions += { 
     case EditDone(`fahrenheit`) => 
     val f = Integer.parseInt(fahrenheit.text) 
     celsius.text = ((f - 32) * 5/9).toString 

     case EditDone(`celsius`) => 
     val c = Integer.parseInt(celsius.text) 
     fahrenheit.text = ((c * 9)/5 + 32).toString 
    } 

कारण है कि मैं EditDone (`fahrenheit`) और EditDone (` celsius`) में backquote (`) का उपयोग करने के लिए अपने पाठ फ़ील्ड घटकों जैसे की पहचान करने की क्या ज़रूरत है fahrenheit और celsius? मैं इसके बजाय EditDone(fahrenheit) का उपयोग क्यों नहीं कर सकता?

धन्यवाद

उत्तर

15

इसे पैटर्न मिलान के साथ करना है। आप एक पैटर्न मैच के भीतर एक लोअर केस नाम का उपयोग करते हैं:

reactions += { 
    case EditDone(fahrenheit) => // ... 
} 

तो मिलान किया जा रहा वस्तु (इस मामले में घटना) किसी भी विजेट पर किसी भी EditDone घटना के खिलाफ मिलान किया जाएगा। यह fahrenheit नाम के विजेट के संदर्भ को बाध्य करेगा। fahrenheit उस मामले के दायरे में एक नया मूल्य बन जाता है।

हालांकि, अगर आप बैकटिक का उपयोग करें:

val fahrenheit = new TextField 
... 
reactions += { 
    case EditDone(`fahrenheit`) => // ... 
} 

तो पैटर्न मैच केवल सफल होगा अगर EditDone घटना मूल्य fahrenheit द्वारा संदर्भित मौजूदा ऑब्जेक्ट, पहले से परिभाषित करने के लिए संदर्भित करता है।

ध्यान दें कि fahrenheit मान का नाम अपरकेस था, जैसे Fahrenheit, तो आपको बैकटिक्स का उपयोग नहीं करना पड़ेगा - ऐसा होगा जैसे आपने उन्हें रखा है। यह उपयोगी है यदि आपके पास स्थिरता या ऑब्जेक्ट्स हैं जिनके लिए आप मिलान करना चाहते हैं - इनके पास आमतौर पर अपरकेस नाम होते हैं।

8
case EditDone(`fahrenheit`) 

EditDone से कोई मान निकालता है और मौजूदा स्थानीय चर fahrenheit यह तुलना, जबकि

case EditDone(fahrenheit) 

EditDone से एक मूल्य के अर्क, एक नया स्थानीय चर fahrenheit (जिससे पीछा बनाता है मौजूदा एक) और नए चर के लिए निकाले गए मान को असाइन करता है।

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