Konversi Implisit
Gunakan dengan hati-hati.
Konversi Implisit adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Scala for Backend Engineering & Functional Programming, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.
Apa itu konversi implisit?
Konversi implisit secara otomatis mengubah nilai dari satu tipe menjadi tipe lain ketika kompiler membutuhkannya. Konversi ini dapat membuat API lebih praktis, tetapi harus digunakan dengan hati-hati karena menyembunyikan apa yang sedang terjadi.
object Main {
import scala.language.implicitConversions
implicit def intToString(x: Int): String = s"number-$x"
def main(args: Array[String]): Unit = {
val s: String = 42
println(s)
}
}Cara kompiler menggunakannya
Ketika tipe suatu nilai tidak sesuai dengan yang diharapkan, kompiler mencari konversi implisit yang memperbaiki ketidaksesuaian tersebut, lalu menyisipkannya secara diam-diam.
object Main {
import scala.language.implicitConversions
implicit def doubleToInt(d: Double): Int = d.toInt
def addTen(x: Int): Int = x + 10
def main(args: Array[String]): Unit = {
println(addTen(3.9))
}
}Mengaktifkan fitur
Mendefinisikan konversi implisit memerlukan impor scala.language.implicitConversions; jika tidak, kompiler akan memberikan peringatan. Hambatan ini sengaja dibuat untuk mencegah penggunaan berlebihan.
object Main {
import scala.language.implicitConversions
case class Celsius(value: Double)
implicit def doubleToCelsius(d: Double): Celsius = Celsius(d)
def describe(c: Celsius): String = s"${c.value} C"
def main(args: Array[String]): Unit = {
println(describe(36.6))
}
}Membungkus untuk metode tambahan (gaya lama)
Sebelum ada metode ekstensi, konversi implisit ke kelas pembungkus merupakan cara untuk "menambahkan" metode ke tipe yang sudah ada, dalam pola yang disebut pustaka pimp-my-library.
object Main {
import scala.language.implicitConversions
class RichInt2(x: Int) {
def squared: Int = x * x
}
implicit def toRich(x: Int): RichInt2 = new RichInt2(x)
def main(args: Array[String]): Unit = {
println(5.squared)
}
}Bahayanya: kejutan yang tidak terlihat
Karena konversi tidak terlihat di lokasi pemanggilan, konversi dapat menimbulkan perilaku yang membingungkan dan kesalahan yang sulit dilacak. Salah ketik mungkin tetap berhasil dikompilasi karena secara tidak sengaja memicu konversi.
object Main {
import scala.language.implicitConversions
implicit def boolToInt(b: Boolean): Int = if (b) 1 else 0
def main(args: Array[String]): Unit = {
val total = true + 4 // surprising! becomes 1 + 4
println(total)
}
}Utamakan konversi eksplisit
Sering kali, pilihan yang paling aman adalah metode biasa yang memiliki nama, bukan metode implisit. Kodenya memang lebih panjang, tetapi maksudnya jelas bagi pembaca.
object Main {
case class Celsius(value: Double)
def fromDouble(d: Double): Celsius = Celsius(d)
def main(args: Array[String]): Unit = {
val c = fromDouble(20.5)
println(c)
}
}Scala 3: kelas tipe Conversion
Scala 3 membuat konversi menjadi eksplisit melalui instans given Conversion[A, B]. Ini memperjelas maksudnya dan tetap memerlukan impor bahasa tersebut.
import scala.language.implicitConversions
object Main:
given Conversion[Int, String] = (x: Int) => s"val-$x"
def main(args: Array[String]): Unit =
val s: String = 7
println(s)Konversi hanya diterapkan sekali
Kompiler menerapkan paling banyak satu konversi implisit pada satu waktu. Kompiler tidak akan merangkai dua konversi untuk menjembatani perbedaan, sehingga kejutan dapat dibatasi.
object Main {
import scala.language.implicitConversions
implicit def intToStr(x: Int): String = x.toString
def needString(s: String): Int = s.length
def main(args: Array[String]): Unit = {
println(needString(12345))
}
}Tempat konversi ditemukan
Seperti implisit lainnya, konversi diselesaikan dari lingkup lokal, impor, dan objek pendamping. Menyimpannya dalam impor yang diberi nama jelas membuat keberadaannya terlihat.
object Conversions:
import scala.language.implicitConversions
implicit def strToLen(s: String): Int = s.length
object Main:
import Conversions._
def main(args: Array[String]): Unit =
val n: Int = "hello"
println(n)Kapan konversi layak digunakan
Penggunaan yang wajar mencakup interoperabilitas dengan tipe Java, pembantu pelebaran numerik, dan batas pustaka. Di luar itu, utamakan metode ekstensi atau fungsi eksplisit.
object Main {
import scala.language.implicitConversions
case class Meters(v: Double)
implicit def metersToDouble(m: Meters): Double = m.v
def main(args: Array[String]): Unit = {
val d: Double = Meters(3.5)
println(d * 2)
}
}Aturan praktis
Jika pembaca tidak dapat mengetahui dari kode bahwa konversi terjadi, itu merupakan tanda peringatan. Gunakan konversi implisit sebagai pilihan terakhir, setelah metode ekstensi dan pemanggilan eksplisit.
object Main {
// Explicit and obvious - usually better
case class Price(cents: Int)
def toDollars(p: Price): Double = p.cents / 100.0
def main(args: Array[String]): Unit = {
println(toDollars(Price(1599)))
}
}Pemeriksaan singkat
Apa risiko utama konversi implisit?
Rangkuman
Anda telah mempelajari konversi implisit dan hal-hal yang perlu diperhatikan:
- Konversi ini secara otomatis mengubah satu tipe menjadi tipe lain saat tipe tidak cocok
- Memerlukan
import scala.language.implicitConversions - Scala 3 menggunakan
given Conversion[A, B] - Hanya satu konversi yang diterapkan pada satu waktu
- Gunakan seperlunya; utamakan metode ekstensi atau pemanggilan eksplisit
Belajar Scala dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 39
- Pelajaran
- 143
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Konversi Implisit” gratis?
Ya — teks lengkap “Konversi Implisit” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Scala for Backend Engineering & Functional Programming, upgrade ke CoddyKit PRO. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Konversi Implisit”?
Gunakan dengan hati-hati. Kamu berlatih Scala for Backend Engineering & Functional Programming dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Scala for Backend Engineering & Functional Programming?
Tidak diperlukan pengalaman sebelumnya. Scala for Backend Engineering & Functional Programming di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Konversi Implisit” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Scala for Backend Engineering & Functional Programming ini?
Ya. Setiap pelajaran Scala for Backend Engineering & Functional Programming menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Parameter Implisit
- given/using di Scala 3
- Konversi Implisit
- Method Ekstensi