कॉल-बाय-नाम: => प्रकार
=> Type
अंकन कॉल-दर-नाम, जिनमें से एक है के लिए खड़ा है कई मायनों मापदंडों पारित किया जा सकता। यदि आप उनसे परिचित नहीं हैं, तो मैं उस विकिपीडिया लेख को पढ़ने के लिए कुछ समय लेने की सलाह देता हूं, भले ही आजकल यह ज्यादातर कॉल-बाय-वैल्यू और कॉल-बाय-रेफरेंस हो।
इसका मतलब यह है कि जो पास किया गया है वह फ़ंक्शन के अंदर मूल्य नाम के लिए प्रतिस्थापित किया गया है। उदाहरण के लिए, इस फ़ंक्शन को लें:
def f(x: => Int) = x * x
अगर मैं इसे इस तरह कहता हूं
var y = 0
f { y += 1; y }
फिर कोड इस तरह निष्पादित होगा
{ y += 1; y } * { y += 1; y }
हालांकि अगर वहाँ एक पहचानकर्ता नाम टकराव होता है तो क्या होता है। पारंपरिक कॉल-बाय-नेम में, नाम क्लैश से बचने के लिए कैप्चर से बचने वाला प्रतिस्थापन नामक एक तंत्र होता है। स्काला में, हालांकि, इसे एक ही परिणाम के साथ एक और तरीके से लागू किया जाता है - पैरामीटर के अंदर पहचानकर्ता नाम जिन्हें फ़ंक्शन में पहचान या छायांकन नहीं किया जा सकता है।
कॉल-बाय-नाम से संबंधित कुछ अन्य बिंदु हैं जो मैं अन्य दो के बारे में बताने के बाद बोलूंगा।
0-एरिटी फंक्शन्स: () => टाइप
वाक्य रचना () => Type
एक के प्रकार के लिए खड़ा है Function0
। यही है, एक फ़ंक्शन जो कोई पैरामीटर नहीं लेता है और कुछ लौटाता है। यह विधि कहने के बराबर है size()
- यह कोई पैरामीटर नहीं लेता है और एक नंबर लौटाता है।
हालांकि, यह दिलचस्प है कि यह सिंटैक्स एक अनाम फ़ंक्शन शाब्दिक के लिए सिंटैक्स के समान है , जो कुछ भ्रम का कारण है। उदाहरण के लिए,
() => println("I'm an anonymous function")
एक गुमनाम फंक्शन शाब्दिक है, जिसका प्रकार ० है
() => Unit
तो हम लिख सकते हैं:
val f: () => Unit = () => println("I'm an anonymous function")
हालांकि, मूल्य के साथ प्रकार को भ्रमित नहीं करना महत्वपूर्ण है।
इकाई => प्रकार
यह वास्तव में सिर्फ एक है Function1
, जिसका पहला पैरामीटर प्रकार का है Unit
। इसे लिखने के अन्य तरीके (Unit) => Type
या होंगे Function1[Unit, Type]
। बात यह है ... यह कभी होने की संभावना नहीं है कि कोई क्या चाहता है। Unit
प्रकार का मुख्य उद्देश्य एक मूल्य एक में कोई दिलचस्पी नहीं है का संकेत है, इसलिए कोई मतलब नहीं है करने के लिए प्राप्त है कि मूल्य।
उदाहरण के लिए विचार करें,
def f(x: Unit) = ...
संभवतः कोई क्या कर सकता है x
? इसका केवल एक ही मूल्य हो सकता है, इसलिए किसी को इसे प्राप्त करने की आवश्यकता नहीं है। एक संभावित उपयोग के लिए वापसी के कार्यों का पीछा किया जाएगा Unit
:
val f = (x: Unit) => println("I'm f")
val g = (x: Unit) => println("I'm g")
val h = f andThen g
क्योंकि andThen
केवल पर परिभाषित किया गया है Function1
, और जिन कार्यों को हम कर रहे हैं वे वापस लौट रहे हैं Unit
, हमें उन्हें Function1[Unit, Unit]
श्रृंखलाबद्ध करने में सक्षम होने के लिए उन्हें परिभाषित करना होगा।
भ्रम के स्रोत
भ्रम का पहला स्रोत प्रकार और शाब्दिक के बीच समानता है जो 0-एरिटी फ़ंक्शन के लिए मौजूद है, कॉल-बाय-नाम के लिए भी मौजूद है। दूसरे शब्दों में, यह सोचकर, क्योंकि
() => { println("Hi!") }
एक शाब्दिक के लिए है () => Unit
, तो
{ println("Hi!") }
के लिए शाब्दिक होगा => Unit
। यह नहीं। वह कोड का एक ब्लॉक है , न कि शाब्दिक।
भ्रम का एक अन्य स्रोत Unit
प्रकार है मान लिखा जाता है ()
, जो 0-एरिटी पैरामीटर सूची की तरह दिखता है (लेकिन ऐसा नहीं है)।
case class Scheduled(time: Int)(callback: => Unit)
। यह काम करता है क्योंकि माध्यमिक पैरामीटर सूची सार्वजनिक रूप से उजागर नहीं होती है, और न ही इसे उत्पन्नequals
/hashCode
विधियों में शामिल किया जाता है ।