2013-01-24 20 views
6

मैं स्कैला सीखना शुरू कर रहा हूं और मैं स्कैला पाठ्यपुस्तक में प्रोग्रामिंग से एक स्निपेट में आया हूं जो मुझे समझ में नहीं आता है। उम्मीद कर रहा था कि कोई मेरी मदद कर सकता है?स्कैला को समझना: तर्कों को गुजरने के रूप में

यह प्रोग्रामिंग इन स्कैला, द्वितीय संस्करण से लिस्टिंग 9.1 से है।

object FileMatcher { 
    private def filesHere = (new java.io.File(".")).listFiles 
} 

private def filesMatching(matcher: String => Boolean) = 
    for (file <- filesHere; if matcher(file.getName)) yield file 

def filesEnding(query: String) = 
    filesMatching(_.endsWith(query)) // ??? 

def filesContaining(query: String) = 
    filesMatching(_.contains(query)) // ??? 

def filesRegex(query: String) = 
    filesMatching(_.matches(query)) // ??? 

मैं // ??? वाली लाइनों के साथ थोड़ा उलझन में हूं। क्या _ का उपयोग किसी भी तरह से एक अज्ञात फ़ंक्शन बनाता है जो filesMatching पर भेजा गया है? या _ के पास इसके साथ कुछ लेना देना नहीं है, और इसके बजाय संकलक देखता है कि filesMatching को एक फ़ंक्शन की आवश्यकता है और इसलिए _.endsWith(query) को अभिव्यक्ति के रूप में निष्पादित नहीं करता है बल्कि इसके बजाय अभिव्यक्ति को फ़ंक्शन बनाता है?

+1

उपरोक्त '// ???' के साथ कोई लाइन नहीं है। शायद आप उन्हें जोड़ना भूल गए? –

+0

इसके बारे में क्षमा करें, अभी '// ???' जोड़ा है। – C0deAttack

+0

[स्कैला \ _ प्लेसहोल्डर्स (यह कोड कैसे काम करता है?) के संभावित डुप्लिकेट (http://stackoverflow.com/questions/6880407/scala-placehold-how-does- यह-code- कार्यक्षमता) –

उत्तर

14

विस्तारित परिभाषा

बेनामी समारोह परिभाषित कर रहे हैं, उनके अधिक वर्बोज़ और पूर्ण रूप में,

(a: A, b: B, ...) => function body //using a, b, ... 

के रूप में जैसे

(a: String, b: String) => a ++ b // concatenates 2 Strings 

अनुमानित प्रकार

अगर संदर्भ (के रूप में जब एक उच्च आदेश समारोह की उम्मीद अपने कार्य तर्क के लिए एक विशिष्ट हस्ताक्षर), तो आपको मापदंडों 'प्रकार छोड़ सकते हैं की जरूरत जानकारी प्रदान करता है,

(a, b, ...) => function body //using a, b, ... 

ईजी

val l = List(1, 2, 3) 

//you can omit the type because filter on List[Int] expects a (Int => Boolean) 
l.filter(i => i < 3) 

प्लेसहोल्डर वाक्य रचना

अंत में आप एक छोटा रूप में अभी भी उपयोग कर सकते हैं, तो अपने मानकों को एक बार प्रत्येक और उसी क्रम में समारोह शरीर द्वारा उपयोग किया जाता है कि आप उन्हें का ऐलान करते हैं, के रूप में

_ ++ _ // which is equivalent to (a, b) => a ++ b 

प्रत्येक _ समारोह के तर्कों

लिए एक प्लेसहोल्डर है

उदा।

filesMatching तर्क प्रकार String => Boolean के एक समारोह ताकि आप

_.endsWith(query) // equivalent to (s: String) => s.endsWith(query) 
_.contains(query) // equivalent to (s: String) => s.contains(query) 
_.matches(query) // equivalent to (s: String) => s.matches(query) 
3

_ जैसा कि यहां उपयोग किया गया है फ़ंक्शन तर्क के लिए शॉर्टेंड है। इस प्रकार filesMatching(_.endsWith(query))filesMatching(f => f.endsWith(query)) के बराबर है। filesMatching के रूप में String => Boolean का एक फ़ंक्शन तर्क है, संकलक अनुमान लगा सकता है कि fString होने की उम्मीद है। तो आप सही हैं कि यह अभिव्यक्ति एक अनाम कार्य है।

0

आपरेशन इस तरह की है सबसे अच्छा समारोह प्रकार को परिभाषित करने के द्वारा किया जाता का उपयोग कर सकते है। मुझे एक उत्कृष्ट प्रदर्शन here मिला।इस पोस्ट के साथ, प्रदर्शन को कार्यों को पारित करने के लिए सर्वोत्तम प्रथाओं को स्पष्ट करना चाहिए क्योंकि तर्क

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

  • कोई संबंधित समस्या नहीं^_^