Underscores and string concatenation in List.map with Scala -
इस सवाल का पहले से ही एक उत्तर है: < / p>
- 5 जवाब
स्काला आपको एक अंडरस्कोर का उपयोग करने देता है एक सरल नक्शा करने के लिए इसलिए उदाहरण के लिए लिखने के बजाय:
def भूमिका (लोगों: स्ट्रिंग *) {people.toList.map (x = & gt; println (x))}
... मैं इसके बजाय लिख सकता हूँ:
def भूमिकाकॉल (लोगों: स्ट्रिंग *) {people.toList.map (println (_))}
हालांकि कुछ कारणों से मैं नहीं लिख सकता हूं:
def greet (लोगों: स्ट्रिंग *) {// यह संकलित नहीं होगा! इसके बजाय मुझे लिखना है:
डीईफ़ नमस्कार (लोगों: स्ट्रिंग * ) {people.toList.map (x = & gt; println ("हैलो" + x))
क्या कोई भी क्यों समझा सकता है? असल में, फ़ंक्शन परिभाषाओं के लिए लघुकथा वाक्यविन्यास केवल तभी अपेक्षित होता है जब कोई नेस्टेड कोष्ठक न हो। इसका कारण यह है कि प्रत्येक घोंसले के शिकार का स्तर अपने स्वयं के दायरे बनाता है जिसमें अंडरस्कोर रहते हैं। REPL में, आप उदाहरण के लिए देख सकते हैं कि:
scala & gt; मूल्य सूची = सूची (1,2,3) .मैप (_ + 1) सूची: सूची [इंट] = सूची (2, 3, 4)
और < > <कोड> स्केला & gt पूर्व; val सूची = सूची (1,2,3) .मैप ((_ + 1)) सूची: सूची [इंट] = सूची (2, 3, 4)
दोनों काम करते हैं, लेकिन एक बार जब आप कोष्ठक के बाद कुछ भी जोड़ते हैं, तो आपको एक त्रुटि मिलती है:
val सूची = सूची (1,2,3) .मैप ((_ + 1) + 1) & lt; console & gt; 58: त्रुटि: विस्तारित फ़ंक्शन के लिए पैरामीटर प्रकार लापता ((x $ 1) = & gt; x $ 1. $ प्लस (1)) val list = सूची (1,2,3) .मैप ((_ + 1) + 1) < / Code>
जैसा कि आप देखते हैं, त्रुटि केवल फ़ंक्शन (_ + 1) से संबंधित है (
(($ x $ 1) = & gt; x $ 1. $ प्लस (1)) < / कोड> संदेश में), पूरी अभिव्यक्ति
(_ + 1) + 1 के लिए नहीं है, इसलिए कोष्ठक में भाग को एक अलग फ़ंक्शन माना जाता है और अंडरस्कोर
_ है इस आंतरिक फ़ंक्शन के दायरे में व्याख्या की गई, बाह्य नहीं।
मुझे वाकई यकीन नहीं है कि क्यों
सूची (1,2,3) .मैप (println (_)) काम करता है लेकिन यह कुछ बढ़त का मामला लगता है जो एक तर्क के कारण सिर्फ संयोग से काम करता है। मैं खुद को विवरण जानने के लिए खुश रहूंगा। वैसे भी, गुमनाम कार्य परिभाषाओं के अंदर कोष्ठकों का उपयोग अंडरस्कोर के साथ ही जल्दी या बाद में परेशानी पैदा करने के लिए बाध्य है और इसे से बचने के लिए बेहतर है।
Comments
Post a Comment