2012-01-04 15 views
6

एक समस्या जिसे मैं लगातार स्कैला में चलाता हूं वह लैम्ब्डा के अभिव्यक्तियों के साथ होता है। उदाहरण के लिए"विस्तारित फ़ंक्शन के लिए गुम पैरामीटर प्रकार"?

JarBuilder.findContainingJar(clazz).foreach {userJars = userJars + _ } 

मेरे जैसे एक त्रुटि देता है:

missing parameter type for expanded function ((x$1) => userJars.$plus(x$1)) 

फिर भी अगर मैं विस्तार खुद ही करता हूं:

JarBuilder.findContainingJar(clazz).foreach {x => userJars = userJars + x } 

यह ठीक काम करता है।

क्या यह एक स्कैला बग है? या क्या मैं कुछ गलत कर रहा हूँ?

+1

'_' विचार करने के लिए इसका मतलब यह नहीं है कि तुम क्या लगता है कि यह वहाँ का मतलब है चाहते हो सकता है को देखते हुए। यह उस संदर्भ में एक * विशेष * प्रतीक है: * किसी भी अन्य साधारण पहचानकर्ता को ठीक काम करना चाहिए *। इस जादू के कारण, 'कुछ (4) .foreach (_ +: सूची())' "ठीक काम करता है"। देखने के लिए, 'कुछ (4) .map (_ + 1) 'और' कुछ (4) .map (x => x + 1)' की तुलना करें। उम्मीद है कि यह एक डुप्लिकेट है (और इस तरह बंद है) या एसएलएस से खींचने वाला एक अच्छा जवाब होगा :) –

+1

http://stackoverflow.com/questions/7695270/underscore-in-list-filter (good), http : //stackoverflow.com/questions/4422016/scala-underscore-minimal- कार्यक्षमता, http://stackoverflow.com/questions/6593277/concise-notation-for-single-arg-anonymous-function-avoiding-underscore-not -wor –

+0

(असल में, मुझे आश्चर्य है कि * कोई * संदर्भ है जहां '_' * * * * एक * अलग तरीके से जादुई नहीं है ...) –

उत्तर

6

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

यदि आप त्रुटि पर बारीकी से देखते हैं, तो आप देख सकते हैं कि आपके असाइनमेंट के दाईं ओर की अभिव्यक्ति एक अज्ञात फ़ंक्शन में विस्तारित की जा रही है।

क्या आप फिर भी पूरा करने के लिए कोशिश कर रहे हैं तो आपको निम्न

userJars = userJars ++ JarBuilder.findContainingJar(clazz) 
+0

धन्यवाद, समझ में आता है। यद्यपि आपका ++ समाधान काम नहीं करता है, क्योंकि "findContainJar" एक विकल्प लौटा रहा है [टी] सूची नहीं [टी] – Heptic

+0

आवश्यक होने पर एक विकल्प को एक इटरटेबल में पूर्ण रूप से परिवर्तित किया जाना चाहिए। यह 2.9.0.1 में काम करता प्रतीत होता है –

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