2012-02-29 22 views
30

वास्तव में क्या विधि पैरामीटर की घोषणा का अर्थ है:समारोह पैरामीटर प्रकार और =>

def myFunc(param: => Int) = param 

=> ऊपरी परिभाषा का अर्थ क्या है?

+19

भविष्य में [प्रतीक हाउंड] (http://symbolhound.com) का उपयोग करें। –

+0

संभावित डुप्लिकेट [स्कैला - '=> कुछ टाइप' का क्या अर्थ है?] (Http: // stackoverflow।कॉम/प्रश्न/7225308/स्कैला-व्हाट-डू-सोमैटाइप-साधन) –

+0

नहीं पता कि मुझे यह कैसे नहीं मिला ... सोचो मुझे अपने चश्मा बदलना चाहिए ... :) – PrimosK

उत्तर

51

यह तथाकथित पास-बाय-नाम है। इसका मतलब है कि आप एक ऐसे कार्य को पार कर रहे हैं जो Int लौटाएगा लेकिन ज्यादातर पैरामीटर के आलसी मूल्यांकन को लागू करने के लिए उपयोग किया जाता है। यह कुछ हद तक समान है:

def myFunc(param:() => Int) = param 

यहां एक उदाहरण है।

def eagerEval(x: Int) = { println("eager"); x; } 
def lazyEval(x: => Int) = { println("lazy"); x; } 

अब निष्पादित उन दोनों answer का उपयोग कर:

def answer = { println("answer"); 40 } 

और दो काम करता है, एक Intद्वारा नामInt और एक विकेट लेने: एक answer समारोह कुछ Int मूल्य लौटने पर विचार करें

eagerEval(answer + 2) 
> answer 
> eager 

lazyEval(answer + 2) 
> lazy 
> answer 

पहला मामला ओबीवी है ous: eagerEval()answer पर कॉल करने से पहले मूल्यांकन किया जाता है और "answer" स्ट्रिंग प्रिंट करता है। दूसरा मामला बहुत दिलचस्प है। हम वास्तव में lazyEval() पर फ़ंक्शन पास कर रहे हैं। lazyEval पहले प्रिंट "lazy" और x पैरामीटर का मूल्यांकन करता है (वास्तव में, पैरामीटर के रूप में पारित x फ़ंक्शन को कॉल करता है)।

भी देखें

+0

ग्रेट स्पष्टीकरण !!! +1 – PrimosK

+2

जो शब्द आप चाहते हैं वह "पास-बाय-नेम" -नॉट "पास-बाय-वैल्यू" नहीं है। मूल्य से गुजरना कुछ अलग है; प्राइमेटिव्स के साथ जावा यही करता है। – Destin

+4

मुझे लगता है कि आपका मतलब है "कॉल-बाय-नेम", "पास-बाय-नेम" या "पास-बाय-वैल्यू" (भाषा स्पेक 4.6.1 देखें) –

10

बस बनाने के लिए यकीन है कि एक जवाब उचित शब्द का उपयोग करता है है: स्काला भाषा विशिष्टता का उपयोग करता है अवधि कॉल-दर-नाम:

एक मान पैरामीटर का प्रकार =>, उदाहरण के लिए पूर्व-निर्धारित किया जा सकता है एक्स: => टी। का प्रकार इस तरह का पैरामीटर पैरामीटर रहित विधि प्रकार => टी है। यह इंगित करता है कि संबंधित तर्क का फ़ंक्शन एप्लिकेशन के बिंदु पर मूल्यांकन नहीं किया जाता है, लेकिन इसके बजाय फ़ंक्शन के भीतर प्रत्येक उपयोग पर मूल्यांकन किया जाता है। यही है, तर्क कॉल-बाय-नाम का उपयोग करके मूल्यांकन किया गया है।

- Scala Language Specification

6

की धारा 4.6.1 के ऊपर अंतर मैं के बीच मुठभेड़ टोमाज़ Nurkiewicz के जवाब देने के लिए जोड़ने के लिए,() => इंट और => इंट है नंगे ब्लॉक के साथ बुला कि दूसरे की अनुमति देता है :

scala> def myfunc(f :() => Int) = println("Evaluated: " + f) 
myfunc: (f:() => Int)Unit 

scala> def myfunc2(f : => Int) = println("Evaluated: " + f) 
myfunc2: (f: => Int)Unit 

scala> myfunc({1}) 
<console>:9: error: type mismatch; 
found : Int(1) 
required:() => Int 
       myfunc({1}) 
       ^

scala> myfunc2({1}) 
Evaluated: 1 
संबंधित मुद्दे