Scala में निहित काम करता है :
कनवर्टर
पैरामीटर मान इंजेक्टर
Implicit के 3 प्रकार के उपयोग हैं
अप्रत्यक्ष रूप से रूपांतरण : यह त्रुटि निर्माण कार्य को इच्छित प्रकार में परिवर्तित करता है
वैल एक्स: स्ट्रिंग = "1"
वैल वाई: इंट = एक्स
स्ट्रिंग Int का उप प्रकार नहीं है , इसलिए त्रुटि पंक्ति 2 में होती है। त्रुटि को हल करने के लिए कंपाइलर इस तरह की विधि को उस दायरे में देखेगा जिसमें अंतर्निहित कीवर्ड है और स्ट्रिंग को तर्क के रूप में लेता है और एक Int देता है ।
इसलिए
implicit def z(a:String):Int = 2
val x :String = "1"
val y:Int = x // compiler will use z here like val y:Int=z(x)
println(y) // result 2 & no error!
अवैध रूप से रिसीवर रूपांतरण : हम आम तौर पर रिसीवर कॉल ऑब्जेक्ट के गुणों, जैसे। विधियाँ या चर। इसलिए किसी भी संपत्ति को एक रिसीवर द्वारा कॉल करने के लिए संपत्ति को उस रिसीवर के वर्ग / वस्तु का सदस्य होना चाहिए।
class Mahadi{
val haveCar:String ="BMW"
}
class Johnny{
val haveTv:String = "Sony"
}
val mahadi = new Mahadi
mahadi.haveTv // Error happening
यहाँ mahadi.haveTv एक त्रुटि उत्पन्न करेगा। क्योंकि स्केला संकलक पहले के लिए दिखेगा haveTv को संपत्ति Mahadi रिसीवर। यह नहीं मिलेगा। दूसरा इसमें एक विधि की तलाश होगी जिसमें निहित कीवर्ड होंगे जो महादानी वस्तु को तर्क के रूप में लेते हैं और जॉनी वस्तु को वापस करते हैं । लेकिन यह यहाँ नहीं है। तो यह त्रुटि पैदा करेगा । लेकिन निम्नलिखित ठीक है।
class Mahadi{
val haveCar:String ="BMW"
}
class Johnny{
val haveTv:String = "Sony"
}
val mahadi = new Mahadi
implicit def z(a:Mahadi):Johnny = new Johnny
mahadi.haveTv // compiler will use z here like new Johnny().haveTv
println(mahadi.haveTv)// result Sony & no error
अवैध रूप से पैरामीटर इंजेक्शन : यदि हम एक विधि कहते हैं और इसके पैरामीटर मान को पारित नहीं करते हैं, तो यह एक त्रुटि का कारण होगा। स्कैला संकलक इस तरह काम करता है - पहले मूल्य पारित करने की कोशिश करेगा, लेकिन इसे पैरामीटर के लिए कोई प्रत्यक्ष मूल्य नहीं मिलेगा।
def x(a:Int)= a
x // ERROR happening
दूसरा यदि पैरामीटर में कोई अंतर्निहित कीवर्ड है, तो वह उस क्षेत्र में किसी भी वैल के लिए दिखेगा, जिसमें उसी प्रकार का मूल्य है। नहीं मिलने पर यह त्रुटि का कारण बनेगा।
def x(implicit a:Int)= a
x // error happening here
Slove करने के लिए इस समस्या को संकलक एक के लिए दिखेगा निहित वैल होने इंट के प्रकार क्योंकि पैरामीटर एक है निहित कीवर्ड ।
def x(implicit a:Int)=a
implicit val z:Int =10
x // compiler will use implicit like this x(z)
println(x) // will result 10 & no error.
एक और उदाहरण:
def l(implicit b:Int)
def x(implicit a:Int)= l(a)
हम इसे भी लिख सकते हैं-
def x(implicit a:Int)= l
क्योंकि मैं एक है अंतर्निहित पैरामीटर और के दायरे में विधि एक्स के शरीर , वहाँ एक है अंतर्निहित स्थानीय चर ( मापदंडों स्थानीय चर रहे हैं ) एक जिनमें से पैरामीटर है एक्स , तो में एक्स के शरीर विधि विधि-हस्ताक्षर ल रों अंतर्निहित तर्क मूल्य है द्वारा दायर एक्स विधि के स्थानीय अंतर्निहित चर (पैरामीटर) a
परोक्ष ।
इसलिए
def x(implicit a:Int)= l
इस तरह संकलक में हो जाएगा
def x(implicit a:Int)= l(a)
एक और उदाहरण:
def c(implicit k:Int):String = k.toString
def x(a:Int => String):String =a
x{
x => c
}
यह, त्रुटि का कारण है क्योंकि जाएगा ग में एक्स {x => c} स्पष्ट रूप-मान-गुजर तर्क या अस्पष्ट वैल में जरूरत दायरे में ।
जब हम विधि x को कॉल करते हैं तो हम फ़ंक्शन शाब्दिक पैरामीटर को स्पष्ट रूप से अंतर्निहित कर सकते हैं
x{
implicit x => c // the compiler will set the parameter of c like this c(x)
}
प्ले-फ्रेमवर्क की एक्शन विधि में इसका उपयोग किया गया है
in view folder of app the template is declared like
@()(implicit requestHreader:RequestHeader)
in controller action is like
def index = Action{
implicit request =>
Ok(views.html.formpage())
}
यदि आपने अनुरोध पैरामीटर का उल्लेख स्पष्ट रूप से नहीं किया है तो आपको लिखा जाना चाहिए-
def index = Action{
request =>
Ok(views.html.formpage()(request))
}