Scala for Backend Engineering & Functional Programming · Pelajaran

Konversi Implisit

Gunakan dengan hati-hati.

Pelajaran 3 dari 413 langkah

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
Gratis untuk memulai

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

  1. Parameter Implisit
  2. given/using di Scala 3
  3. Konversi Implisit
  4. Method Ekstensi
← Kembali ke Scala for Backend Engineering & Functional Programming