Setelah membaca artikel-artikel sebelumnya tentang Habr, para
tyts dan
tyts tidak dapat dengan cepat memahami apa yang tersirat dalam Scala. Mari kita coba mencari tahu bersama.
Jadi, implisit dalam Scala memungkinkan Anda untuk menghindari metode panggilan atau referensi eksplisit ke variabel, dan sebagai gantinya memungkinkan kompiler untuk menemukan data implisit yang diperlukan itu sendiri.
Sebagai contoh, kita dapat menulis fungsi untuk mengkonversi dari Float ke Int (FloatToInt) dan, alih-alih memanggil fungsi ini secara eksplisit, kompiler akan melakukannya secara implisit untuk kita:
def double(value: Int) = value * 2 implicit def FloatToInt(value: Float):Int = value.toInt println(double(2.5F))
Bingung? Mari kita bereskan semuanya.
Jadi, hari ini kita melihat dua kategori implisit, yaitu:
- Parameter (nilai) implisit . Mereka secara otomatis diteruskan oleh nilai-nilai kompiler yang dinyatakan melalui implisit.
- Konversi tersirat Jika jenis parameter yang diharapkan tidak cocok dengan parameter input, kompiler mencari metode apa pun dalam lingkup yang ditandai implisit dan dengan parameter yang diharapkan dan parameter input yang diperlukan dalam situasi ini dan secara otomatis melewatinya.
Parameter implisit
Parameter implisit adalah
parameter fungsi yang didahului oleh kata kunci implisit. Ini berarti bahwa jika tidak ada nilai yang diteruskan ketika fungsi dipanggil, kompiler akan secara pribadi mencari parameter implisit dan memberikannya kepada kami.
Misalnya, fungsi yang mengambil nilai parameter implisit sebagai input dan menggandakannya:
def double(implicit value: Int) = value * 2
Tanpa parameter implisit, itu akan gagal dengan kesalahan:
def double(implicit value: Int) = value * 2 println(double)
Dengan melewati parameter eksplisit, ini akan berfungsi:
def double(implicit value: Int) = value * 2 println(double(3))
Dengan parameter implisit, akan terlihat seperti ini:
def double(implicit value: Int) = value * 2 implicit val multiplier = 2 println(double)
Tetapi Anda harus berhati-hati:
def double(implicit value: Int) = value * 2 implicit val multiplier = 2 implicit val multiplier2 = 1 println(double)
Dan akhirnya, contoh dengan def lewat sebagai parameter implisit:
def double(implicit value: Int) = value * 2 val cappucinoLarge: Boolean = false implicit def cappucinoPrice: Int = if (cappucinoLarge) 200 else 100 println(double)
Yaitu pada akhirnya kita akan berhasil
double(cappucinoPrice())
Catatan Sintaks:
def func1(implicit value1: Int)
Konversi tersirat
Kembali ke contoh dari Float ke Int:
def double(value: Int) = value * 2 implicit def FloatToInt(value: Float):Int = value.toInt println(double(2.5F))
Saat memanggil ganda, kami memiliki tipe ketidakcocokan dari parameter yang diharapkan (Int) dengan parameter input (Float). Oleh karena itu, kompiler mencari metode apa pun dalam lingkup, ditandai implisit dan dengan parameter yang diharapkan (Int) dan parameter input (Float) yang diperlukan dalam situasi ini. Menemukan FloatToInt, melakukan konversi, dan meneruskan nilai yang diinginkan menjadi dua kali lipat.
Sekarang, saya harap, ini menjadi lebih jelas. Semua sukses dalam menguasai Scala!