गणितज्ञों के अपने छोटे मज़ेदार तरीके होते हैं, इसलिए कहने के बजाय "हम f
इसे फ़ंक्शन x
को एक पैरामीटर के रूप में कहते हैं" जैसा कि हम प्रोग्रामर कहेंगे, वे " f
अपने तर्क पर फ़ंक्शन लागू करने" के बारे में बात करते हैं x
।
गणित और कंप्यूटर विज्ञान में, लागू एक फ़ंक्शन है जो कार्यों को तर्कों पर लागू करता है।
विकिपीडिया
apply
स्काला में ऑब्जेक्ट ओरिएंटेड और फंक्शनल प्रतिमानों के बीच अंतर को बंद करने के उद्देश्य से कार्य करता है। स्काला में प्रत्येक फ़ंक्शन को एक ऑब्जेक्ट के रूप में दर्शाया जा सकता है। प्रत्येक फ़ंक्शन का एक OO प्रकार भी होता है: उदाहरण के लिए, एक फ़ंक्शन जो Int
पैरामीटर लेता है और एक Int
OO प्रकार का होता है Function1[Int,Int]
।
// define a function in scala
(x:Int) => x + 1
// assign an object representing the function to a variable
val f = (x:Int) => x + 1
चूंकि सब कुछ स्काला में एक वस्तु है, f
अब इसे Function1[Int,Int]
ऑब्जेक्ट के संदर्भ के रूप में माना जा सकता है । उदाहरण के लिए, हम toString
इनहेरिट की गई विधि को कॉल कर सकते हैं Any
, जो कि शुद्ध फ़ंक्शन के लिए असंभव होगा, क्योंकि फ़ंक्शन में विधियाँ नहीं हैं:
f.toString
या हम किसी अन्य Function1[Int,Int]
ऑब्जेक्ट को कॉल compose
विधि पर परिभाषित कर सकते हैं और f
दो अलग-अलग कार्यों को एक साथ कर सकते हैं:
val f2 = f.compose((x:Int) => x - 1)
अब अगर हम वास्तव में फ़ंक्शन को निष्पादित करना चाहते हैं, या जैसा कि गणितज्ञ कहते हैं, "इसके तर्कों पर एक फ़ंक्शन लागू करें" हम ऑब्जेक्ट apply
पर विधि को कॉल करेंगे Function1[Int,Int]
:
f2.apply(2)
लेखन f.apply(args)
हर बार जब आप एक समारोह एक वस्तु के रूप में प्रतिनिधित्व पर अमल करना चाहते हैं वस्तु उन्मुख रास्ता है, लेकिन ज्यादा अतिरिक्त जानकारी के जोड़े बिना कोड के लिए अव्यवस्था का एक बहुत जोड़ना होगा और यह अच्छा होगा इस तरह के, अधिक मानक संकेतन का उपयोग करने में सक्षम हो के रूप में f(args)
। यही कारण है कि जब भी स्काला संकलक में कदम रखता है और जब भी हमारे पास f
फ़ंक्शन ऑब्जेक्ट का संदर्भ f (args)
होता है और प्रतिनिधित्व फ़ंक्शन को तर्क लागू करने के लिए लिखता है तो कंपाइलर चुपचाप f (args)
ऑब्जेक्ट विधि कॉल में फैलता है f.apply (args)
।
स्काला में प्रत्येक फ़ंक्शन को एक ऑब्जेक्ट के रूप में माना जा सकता है और यह दूसरे तरीके से भी काम करता है - प्रत्येक ऑब्जेक्ट को एक फ़ंक्शन के रूप में माना जा सकता है, बशर्ते इसकी apply
विधि हो। फ़ंक्शन नोटेशन में ऐसी वस्तुओं का उपयोग किया जा सकता है:
// we will be able to use this object as a function, as well as an object
object Foo {
var y = 5
def apply (x: Int) = x + y
}
Foo (1) // using Foo object in function notation
ऐसे कई उपयोग मामले हैं जब हम किसी वस्तु को एक फ़ंक्शन के रूप में मानना चाहेंगे। सबसे आम परिदृश्य एक कारखाना पैटर्न है । फ़ैक्टरी विधि का उपयोग करके कोड में अव्यवस्था जोड़ने के बजाय, हम apply
संबद्ध वर्ग का एक नया उदाहरण बनाने के लिए तर्कों के एक सेट पर आपत्ति कर सकते हैं :
List(1,2,3) // same as List.apply(1,2,3) but less clutter, functional notation
// the way the factory method invocation would have looked
// in other languages with OO notation - needless clutter
List.instanceOf(1,2,3)
इसलिए apply
विधि स्कैला में कार्यों और वस्तुओं के बीच की खाई को बंद करने का एक आसान तरीका है।