Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian · Pelajaran

Jenis Kesatuan dan Persilangan

Ciri jenis baharu

Pelajaran 4 daripada 413 langkah

Jenis Kesatuan dan Persilangan ialah pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian percuma di CoddyKit. Ini ialah pelajaran 4 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.

Ciri Jenis Baharu

Scala 3 menambah jenis kesatuan (A | B) dan jenis persilangan (A & B) kepada sistem jenis. Ciri ini membolehkan anda menerangkan nilai dengan lebih tepat tanpa hierarki pewarisan.

object Main:
  def main(args: Array[String]): Unit =
    println("Union: A | B, Intersection: A & B")

Asas Jenis Kesatuan

Jenis kesatuan A | B mewakili nilai yang sama ada A atau B. Ia ialah operasi OR berasaskan teori set terhadap jenis.

object Main:
  def show(x: Int | String): String = x match
    case i: Int    => s"int $i"
    case s: String => s"str $s"

  def main(args: Array[String]): Unit =
    println(show(42))
    println(show("hi"))

Kesatuan Tidak Memerlukan Superjenis Sepunya

Berbeza daripada Either Scala 2, jenis kesatuan tidak memerlukan pembalutan. Mana-mana dua jenis boleh disatukan tanpa berkongsi kelas induk.

object Main:
  def parse(input: Int | Boolean): String =
    input match
      case n: Int     => s"number $n"
      case b: Boolean => s"flag $b"

  def main(args: Array[String]): Unit =
    println(parse(7))
    println(parse(true))

Kesatuan untuk Pemodelan Ralat

Jenis kesatuan berguna untuk hasil ralat ringan tanpa jenis pembalut. Apabila digabungkan dengan enum atau singleton, kodnya mudah dibaca.

case object NotFound

object Main:
  def lookup(id: Int): String | NotFound.type =
    if id == 1 then "Alice" else NotFound

  def main(args: Array[String]): Unit =
    println(lookup(1))
    println(lookup(2))

Asas Jenis Persilangan

Jenis persilangan A & B mewakili nilai yang merupakan A dan B. Ia ialah operasi AND berasaskan teori set, yang sering digunakan untuk menggabungkan trait.

trait Named:
  def name: String
trait Aged:
  def age: Int

object Main:
  def describe(p: Named & Aged): String =
    s"${p.name} is ${p.age}"

  def main(args: Array[String]): Unit =
    val person = new Named with Aged:
      def name = "Bob"
      def age = 40
    println(describe(person))

Persilangan Bersifat Komutatif

Turutan tidak penting bagi jenis persilangan: A & B ialah jenis yang sama dengan B & A. Ini berbeza daripada jenis kompaun Scala 2 A with B, yang peka terhadap turutan dalam sesetengah penyelesaian ahli.

trait Readable:
  def read: String
trait Writable:
  def write(s: String): Unit

object Main:
  def use(r: Readable & Writable): Unit =
    r.write("x")
    println(r.read)

  def main(args: Array[String]): Unit =
    val rw = new Readable with Writable:
      def read = "data"
      def write(s: String) = println(s"wrote $s")
    use(rw)

Menggabungkan Pelbagai Trait

Anda boleh menyilangkan lebih daripada dua jenis. Hasilnya memerlukan semua keupayaan yang disenaraikan.

trait A: def a: Int
trait B: def b: Int
trait C: def c: Int

object Main:
  def sum(x: A & B & C): Int = x.a + x.b + x.c

  def main(args: Array[String]): Unit =
    val v = new A with B with C:
      def a = 1
      def b = 2
      def c = 3
    println(sum(v))

Alias Jenis untuk Kesatuan

Jenis kesatuan yang panjang boleh dinamakan dengan alias type supaya tandatangan kekal mudah dibaca.

type Json = Int | String | Boolean

object Main:
  def render(j: Json): String = j match
    case i: Int     => i.toString
    case s: String  => s"\"$s\""
    case b: Boolean => b.toString

  def main(args: Array[String]): Unit =
    println(render("hi"))
    println(render(true))

Padanan Menyeluruh pada Kesatuan

Penyusun mengetahui ahli-ahli sesuatu kesatuan, jadi padanan boleh disemak kelengkapannya. Mengendalikan setiap alternatif menjadikan padanan itu menyeluruh.

type Shape = "circle" | "square"

object Main:
  def sides(s: Shape): Int = s match
    case "circle" => 0
    case "square" => 4

  def main(args: Array[String]): Unit =
    println(sides("square"))

Pelebaran Kesatuan

Apabila anda menetapkan nilai kesatuan kepada pemboleh ubah yang jenisnya dibuat kesimpulan, Scala mengekalkan jenis kesatuan tersebut. Perhatikan bahawa sesetengah operasi melebarkan jenis kepada had atas terendah, jadi nyatakan jenis apabila anda mahu mengekalkan kesatuan.

object Main:
  def pick(flag: Boolean): Int | String =
    if flag then 1 else "one"

  def main(args: Array[String]): Unit =
    val x: Int | String = pick(false)
    println(x)

Bila Hendak Menggunakan Setiap Jenis

Pilih alat yang sesuai.

  • Kesatuan: nilai ialah salah satu daripada beberapa jenis (OR).
  • Persilangan: nilai memenuhi beberapa trait serentak (AND).
  • Kesatuan mengelakkan jenis pembalut; persilangan mengelakkan pewarisan yang mendalam.
trait Logger: def log(s: String): Unit
trait Clock:  def now: Long

object Main:
  def run(env: Logger & Clock): Unit =
    env.log(s"time=${env.now}")

  def main(args: Array[String]): Unit =
    val env = new Logger with Clock:
      def log(s: String) = println(s)
      def now = 100L
    run(env)

Semakan Ringkas

Uji pemahaman anda tentang jenis kesatuan dan persilangan.

Rumusan

Anda telah mempelajari jenis kesatuan dan persilangan Scala 3.

  • A | B: nilai ialah A atau B, tanpa pembalut atau induk sepunya.
  • A & B: nilai ialah A dan B; bersifat komutatif.
  • Gunakan padanan corak untuk mengecilkan kesatuan; gabungkan trait dengan persilangan.
  • Gunakan alias type untuk menamakan kesatuan yang panjang.
object Main:
  def length(x: String | List[Int]): Int = x match
    case s: String    => s.length
    case l: List[Int] => l.length

  def main(args: Array[String]): Unit =
    println(length("hello"))
    println(length(List(1, 2, 3)))
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 “Jenis Kesatuan dan Persilangan” percuma?

Ya — teks penuh “Jenis Kesatuan dan Persilangan” 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 “Jenis Kesatuan dan Persilangan”?

Ciri jenis baharu 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 4 daripada 4.

Berapa lamakah pelajaran “Jenis Kesatuan dan Persilangan” 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. Indentasi Signifikan
  2. Enum dalam Scala 3
  3. Jenis Opaque
  4. Jenis Kesatuan dan Persilangan
← Kembali ke Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian