Scala örtük olarak şöyle çalışır :
Dönüştürücü
Parametre değer enjektörü
Örtük kullanımın 3 türü vardır
Dolaylı olarak dönüşüm yazın : Hata üreten atamayı amaçlanan türe dönüştürür
val x: String = "1"
val y: Int = x
Dize Int'nin alt türü değildir , bu nedenle satır 2'de hata oluşur. Hatayı gidermek için derleyici, örtük anahtar sözcüğü olan ve bir String'i argüman olarak alan ve bir Int döndüren kapsamdaki bir yöntemi arar .
yani
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!
Örtük olarak alıcı dönüşümü : Biz genellikle alıcı çağrı nesnesinin özelliklerini, örn. yöntemler veya değişkenler. Bu nedenle, herhangi bir özelliği bir alıcı tarafından çağırmak için, söz konusu alıcının sınıfının / nesnesinin üyesi olması gerekir.
class Mahadi{
val haveCar:String ="BMW"
}
class Johnny{
val haveTv:String = "Sony"
}
val mahadi = new Mahadi
mahadi.haveTv // Error happening
Burada mahadi.haveTv bir hata üretir. Çünkü scala derleyicisi öncelikle mahadi alıcısına haveTv özelliğini arayacaktır . Bulamayacak. İkincisi o sahip kapsamında bir yöntem arayacaktır örtülü anahtar kelime almak Mahadi nesnesini argüman olarak ve döner Johnny nesnesi . Ama burada yok. Böylece hata yaratacaktır . Ama aşağıdakiler tamam.
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
Örtük olarak parametre enjeksiyonu : Bir yöntemi çağırır ve parametre değerini geçmezsek, hataya neden olur. Skala derleyici şu şekilde çalışır - önce değeri geçmeye çalışır, ancak parametre için doğrudan bir değer elde etmez.
def x(a:Int)= a
x // ERROR happening
İkincisi, parametrenin herhangi bir örtük anahtar sözcüğü varsa , kapsamda aynı değer türüne sahip herhangi bir val arar . Aksi takdirde hataya neden olur.
def x(implicit a:Int)= a
x // error happening here
Bu sorun derleyici bir arayacaktır slove için örtülü val sahip Int türünü parametre çünkü bir sahip örtülü anahtar kelime .
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.
Başka bir örnek:
def l(implicit b:Int)
def x(implicit a:Int)= l(a)
ayrıca şöyle yazabiliriz-
def x(implicit a:Int)= l
Çünkü L bir sahiptir örtülü bir parametre ve kapsamındaki yöntem olup x vücudunun bir orada kapalı yerel değişken ( parametreler yerel değişkenler ) bir parametre olan , x , böylece de, X gövdesi yöntemi yöntemi imza L'in örtülü bağımsız değişken değeri olan x yönteminin yerel örtük değişkeni (parametresi) tarafından dolaylı olarak dosyalandıa
.
Yani
def x(implicit a:Int)= l
böyle derleyicide olacak
def x(implicit a:Int)= l(a)
Başka bir örnek:
def c(implicit k:Int):String = k.toString
def x(a:Int => String):String =a
x{
x => c
}
çünkü, hataya neden olur C de x {x => C} açıkça değer geçirme bağımsız değişken veya kapalı val ihtiyacı kapsamına .
Böylece x yöntemini çağırdığımızda fonksiyon değişmezinin parametresini açıkça örtük yapabiliriz
x{
implicit x => c // the compiler will set the parameter of c like this c(x)
}
Bu, Play-Framework'ün eylem yönteminde kullanılmıştır
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())
}
request parametresini açıkça örtük olarak belirtmezseniz,
def index = Action{
request =>
Ok(views.html.formpage()(request))
}