Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian · Pelajaran

Penukaran Tersirat

Gunakan dengan berhati-hati

Pelajaran 3 daripada 413 langkah

Penukaran Tersirat ialah pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian merangkumi sejumlah 4 pelajaran.

Apakah itu penukaran implisit?

Penukaran implisit mengubah nilai daripada satu jenis kepada jenis lain secara automatik apabila pengompil memerlukannya. Ia boleh menjadikan API lebih mudah digunakan, tetapi mesti digunakan dengan berhati-hati kerana perkara yang berlaku menjadi tersembunyi.

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 pengompil menggunakannya

Apabila jenis sesuatu nilai tidak sepadan dengan perkara yang dijangka, pengompil mencari penukaran implisit yang membetulkan ketidakpadanan itu lalu menyisipkannya secara senyap.

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))
  }
}

Mendayakan ciri tersebut

Mentakrifkan penukaran implisit memerlukan import scala.language.implicitConversions, jika tidak pengompil akan memberikan amaran. Ini ialah halangan yang disengajakan untuk menggalakkan penggunaan secara sederhana.

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 kaedah tambahan (gaya lama)

Sebelum kaedah sambungan diperkenalkan, penukaran implisit kepada kelas pembungkus ialah cara untuk “menambah” kaedah kepada jenis sedia ada, iaitu corak yang dipanggil pustaka ubah suai sendiri.

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)
  }
}

Bahaya: kejutan senyap

Oleh sebab penukaran tidak kelihatan di tapak panggilan, ia boleh menyebabkan tingkah laku yang mengelirukan dan ralat yang sukar dijejaki. Kesilapan ejaan mungkin berjaya dikompil kerana penukaran tercetus secara tidak sengaja.

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 penukaran eksplisit

Sering kali pilihan paling selamat ialah kaedah bernama biasa dan bukannya kaedah implisit. Kodnya lebih panjang tetapi jelas kepada 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 jenis Conversion

Scala 3 menjadikan penukaran eksplisit melalui tika given Conversion[A, B]. Ini lebih jelas dari segi tujuan dan masih memerlukan import 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)

Penukaran hanya digunakan sekali

Pengompil menggunakan paling banyak satu penukaran implisit pada satu-satu masa. Ia tidak akan merantaikan dua penukaran untuk merapatkan jurang, sekali gus mengehadkan kejutan.

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 penukaran ditemui

Seperti implisit lain, penukaran diselesaikan daripada skop setempat, import dan objek pendamping. Menyimpannya dalam import yang dinamakan dengan jelas menjadikan kewujudannya kelihatan.

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)

Apabila penukaran munasabah

Penggunaan yang sah termasuk kesalingkendalian dengan jenis Java, pembantu pelebaran angka dan sempadan pustaka. Selain itu, utamakan kaedah sambungan 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)
  }
}

Panduan umum

Jika pembaca tidak dapat mengetahui daripada kod bahawa penukaran berlaku, itu ialah tanda amaran. Gunakan penukaran implisit sebagai pilihan terakhir, selepas kaedah sambungan dan panggilan 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)))
  }
}

Semakan Pantas

Apakah risiko utama penukaran implisit?

Imbas Kembali

Anda telah mempelajari penukaran tersirat dan batasannya:

  • Menukar satu jenis kepada jenis yang lain secara automatik apabila jenis tidak sepadan
  • Memerlukan import scala.language.implicitConversions
  • Scala 3 menggunakan given Conversion[A, B]
  • Hanya satu penukaran digunakan pada satu-satu masa
  • Gunakannya secara berhemat; utamakan kaedah sambungan atau panggilan eksplisit
Percuma untuk bermula

Pelajari Scala dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
39
Pelajaran
143

Soalan Lazim

Adakah pelajaran “Penukaran Tersirat” percuma?

Ya — teks penuh “Penukaran Tersirat” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian, tingkat taraf kepada CoddyKit PRO. Kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Penukaran Tersirat”?

Gunakan dengan berhati-hati Anda berlatih Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Penukaran Tersirat” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian ini?

Ya. Setiap pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Parameter Tersirat
  2. given/using Scala 3
  3. Penukaran Tersirat
  4. Kaedah Sambungan
← Kembali ke Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian