Dalam scala implisit berfungsi sebagai :
Konverter
Nilai parameter injektor
Ada 3 jenis penggunaan Implisit
Konversi jenis tersirat : Ini mengkonversi tugas memproduksi kesalahan menjadi tipe yang dimaksud
val x: String = "1"
val y: Int = x
String bukan sub tipe Int , jadi kesalahan terjadi pada baris 2. Untuk menyelesaikan kesalahan, kompiler akan mencari metode seperti itu dalam lingkup yang memiliki kata kunci implisit dan menggunakan String sebagai argumen dan mengembalikan sebuah Int .
begitu
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!
Konversi penerima secara implisit : Kami umumnya dengan properti objek panggilan penerima, misalnya. metode atau variabel. Jadi, untuk memanggil properti apa pun oleh penerima, properti harus menjadi anggota kelas / objek penerima itu.
class Mahadi{
val haveCar:String ="BMW"
}
class Johnny{
val haveTv:String = "Sony"
}
val mahadi = new Mahadi
mahadi.haveTv // Error happening
Di sini mahadi.haveTv akan menghasilkan kesalahan. Karena scala compiler pertama akan mencari haveTv properti untuk Mahadi penerima. Itu tidak akan menemukan. Kedua akan mencari metode dalam lingkup yang memiliki kata kunci implisit yang mengambil objek Mahadi sebagai argumen dan mengembalikan objek Johnny . Tetapi tidak ada di sini. Jadi itu akan membuat kesalahan . Tapi berikut ini tidak apa-apa.
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
Injeksi parameter secara implisit : Jika kita memanggil metode dan tidak memberikan nilai parameternya, itu akan menyebabkan kesalahan. Scala compiler berfungsi seperti ini - pertama akan mencoba memberikan nilai, tetapi tidak akan mendapatkan nilai langsung untuk parameter.
def x(a:Int)= a
x // ERROR happening
Kedua, jika parameter memiliki kata kunci implisit, ia akan mencari val dalam lingkup yang memiliki jenis nilai yang sama. Jika tidak mendapatkannya akan menyebabkan kesalahan.
def x(implicit a:Int)= a
x // error happening here
Untuk mencari masalah ini kompiler akan mencari val implisit yang memiliki tipe Int karena parameter a memiliki kata kunci implisit .
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.
Contoh lain:
def l(implicit b:Int)
def x(implicit a:Int)= l(a)
kita juga bisa menulis seperti-
def x(implicit a:Int)= l
Karena l memiliki parameter implisit dan dalam lingkup tubuh metode x , ada variabel lokal implisit ( parameter adalah variabel lokal ) a yang merupakan parameter x , jadi dalam tubuh metode x nilai argumen implisit metode-tanda tangan l adalah diajukan oleh variabel (parameter) lokal implisit metode x secara a
implisit .
Begitu
def x(implicit a:Int)= l
akan berada di kompiler seperti ini
def x(implicit a:Int)= l(a)
Contoh lain:
def c(implicit k:Int):String = k.toString
def x(a:Int => String):String =a
x{
x => c
}
itu akan menyebabkan kesalahan, karena c dalam x {x => c} perlu secara eksplisit melewati nilai dalam argumen atau val implisit dalam lingkup .
Jadi kita dapat membuat parameter fungsi literal tersirat secara eksplisit ketika kita memanggil metode x
x{
implicit x => c // the compiler will set the parameter of c like this c(x)
}
Ini telah digunakan dalam metode aksi Play-Framework
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())
}
jika Anda tidak menyebutkan parameter permintaan sebagai implisit secara eksplisit maka Anda harus telah ditulis-
def index = Action{
request =>
Ok(views.html.formpage()(request))
}