2011-03-09 17 views

उत्तर

61

फ़ंक्शन शाब्दिक फ़ंक्शन को परिभाषित करने के लिए एक वैकल्पिक वाक्यविन्यास है। यह तब उपयोगी होता है जब आप किसी विधि को किसी विधि के लिए तर्क के रूप में पास करना चाहते हैं (विशेष रूप से एक उच्च-आदेश एक फोल्ड या फ़िल्टर ऑपरेशन की तरह) लेकिन आप एक अलग फ़ंक्शन को परिभाषित नहीं करना चाहते हैं। फ़ंक्शन अक्षर अज्ञात हैं - उनके पास डिफ़ॉल्ट रूप से कोई नाम नहीं है, लेकिन आप उन्हें एक चर के लिए बाध्य करके एक नाम दे सकते हैं। एक समारोह शाब्दिक इसलिए की तरह परिभाषित किया गया है:

(a:Int, b:Int) => a + b 

आप उन्हें चर करने के लिए बाध्य कर सकते हैं:

val add = (a:Int, b:Int) => a + b 
add(1, 2) // Result is 3 

जैसे कि मैंने पहले कहा, समारोह शाब्दिक उच्च क्रम कार्यों के लिए तर्क के रूप में पारित करने के लिए उपयोगी होते हैं। वे अन्य कार्यों के भीतर घिरे एक-लाइनर या सहायक कार्यों को परिभाषित करने के लिए भी उपयोगी हैं।

A Tour of Scala फ़ंक्शन अक्षरों के लिए एक बहुत अच्छा संदर्भ देता है (वे उन्हें अनाम कार्य कहते हैं)।

+13

मैं इसे बाहर बात करने के लिए कैसे एक समारोह शाब्दिक बस FunctionN पर चीनी है उपयोगी हो सकता है लगता है: उदाहरण के लिए "लंबा" संस्करण। साथ ही, जब मेरे पास +1 है, तो आमतौर पर यह नहीं होता है कि "फ़ंक्शन को परिभाषित करने के लिए वैकल्पिक वाक्यविन्यास [क्या आपका मतलब विधि ????]" है क्योंकि *** फ़ंक्शन विधियां नहीं हैं *** - विधियां ही बनाई गई हैं * केवल * उन वर्गों और संदेशों पर लागू होते हैं जिन्हें उन्हें भेजा जा सकता है (कक्षाएं)। * फ़ंक्शन * "प्रथम श्रेणी मान" (ऑब्जेक्ट्स जो 'लागू करें' और कुछ अन्य का समर्थन करते हैं) हैं। –

+0

डीफ़ एड = (ए: इंट, बी: इंट) => ए + बी एक जैसा नहीं है? मैं किसी अन्य फ़ंक्शन को पास करने के लिए इस 'एड' का उपयोग भी कर सकता हूं – ses

+0

आप अंडरस्कोप ऑपरेटर के साथ मौजूदा फ़ंक्शन से फ़ंक्शन शाब्दिक भी बना सकते हैं: def addTwoNumbers (ए: इंट, बी: इंट) = ए + बी; def add2 = addTwoNumbers _ – Blitzkr1eg

12

स्कैला में अन्य प्रकार के अक्षरों के लिए फ़ंक्शन अक्षरों की तुलना करना उपयोगी हो सकता है। Literalsके लिए संख्यात्मक चीनी हैं मूल्यों का प्रतिनिधित्व करने वाले कुछ प्रकारों की भाषा विशेष रूप से महत्वपूर्ण मानी जाती है। Scala has पूर्णांक अक्षर, चरित्र अक्षर, स्ट्रिंग अक्षर, इत्यादि। स्कैला फ़ंक्शन अक्षरों द्वारा स्रोत कोड में प्रतिनिधित्व करने वाले प्रथम श्रेणी मानों के रूप में कार्य करता है। ये फ़ंक्शन मान एक विशेष function type में रहते हैं। उदाहरण के लिए,

  • 5 शाब्दिक एक पूर्णांक Int प्रकार
  • 'a' में एक मूल्य का प्रतिनिधित्व कर रहा है एक चरित्र शाब्दिक एक समारोह शाब्दिक में Int => Int समारोह प्रकार
  • एक मूल्य का प्रतिनिधित्व कर रहा है Char प्रकार
  • (x: Int) => x + 2 में एक मूल्य का प्रतिनिधित्व करता है

साहित्य अक्सर अज्ञात मानों के रूप में उपयोग किया जाता है, यानी, उन्हें नामित चर के लिए पहले बाध्य किए बिना। इससे प्रोग्राम को अधिक संक्षिप्त बनाने में मदद मिलती है और यह उचित होता है जब शाब्दिक का पुन: उपयोग करने योग्य नहीं होता है। - जो शाब्दिक बनाम के लिए एक आम तौर पर अच्छा मामले देना होगा

List(1,2,3).filter((x: Int) => x > 2) 

बनाम

val one: Int = 1 
val two: Int = 2 
val three: Int = 3 
val greaterThan2: (Int => Int) = (x: Int) => x > two 
List(one,two,three).filter(greaterThan2) 
+1

क्या प्रकारों को और स्पष्ट करने का कोई तरीका है? यह काम करता है: 'सूची (1,2,3) .map (x => x + 10) ' यह काम नहीं करता है:' सूची (1,2,3) .map ((x: Int): Str = > एक्स।toString) ' यह काम करता है लेकिन यह इतना स्पष्ट नहीं है: 'सूची (1,2,3)। मैप ((x: int) => x.toString)' या यदि मैं ऐसा करना चाहता हूं तो मुझे नाम का उपयोग करना चाहिए समारोह? – monteiro

+1

@ मॉन्टेरोरो 'सूची (1,2,3)। मैप ((एक्स: इंट) => {x.toString}: स्ट्रिंग) ' –

+0

बहुत सराहना की! :) – monteiro

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