0Pricing
Scala for Backend Engineering & Functional Programming · Pelajaran

Tipe Union dan Irisan

Fitur tipe baru

Tipe Union dan Irisan adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 4 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.

Fitur Tipe Baru

Scala 3 menambahkan tipe union (A | B) dan tipe irisan (A & B) ke sistem tipe. Keduanya memungkinkan Anda mendeskripsikan nilai dengan lebih tepat tanpa hierarki pewarisan.

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

Dasar-Dasar Tipe Union

Tipe union A | B merepresentasikan nilai yang merupakan A atau B. Ini adalah OR secara teori himpunan atas tipe.

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

Union Tidak Memerlukan Supertipe Bersama

Berbeda dari Either di Scala 2, tipe union tidak memerlukan pembungkusan. Dua tipe apa pun dapat digabungkan sebagai union tanpa berbagi 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))

Union untuk Pemodelan Error

Tipe union berguna untuk hasil error ringan tanpa tipe pembungkus. Jika digabungkan dengan enum atau singleton, hasilnya 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))

Dasar-Dasar Tipe Irisan

Tipe irisan A & B merepresentasikan nilai yang merupakan A dan B sekaligus. Ini adalah AND secara teori himpunan dan 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))

Irisan Bersifat Komutatif

Urutan tidak penting untuk tipe irisan: A & B adalah tipe yang sama dengan B & A. Ini berbeda dari tipe gabungan Scala 2 A with B, yang peka terhadap urutan dalam beberapa resolusi anggota.

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 Banyak Trait

Anda dapat mengiriskan lebih dari dua tipe. Hasilnya memerlukan semua kemampuan yang tercantum.

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 Tipe untuk Union

Tipe union yang panjang dapat diberi nama dengan alias type agar tanda tangan tetap 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))

Pencocokan Menyeluruh pada Union

Kompilator mengetahui anggota union, sehingga pencocokan dapat diperiksa kelengkapannya. Menangani setiap alternatif membuat pencocokan tersebut mencakup semua kemungkinan.

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 Union

Saat Anda menetapkan nilai union ke variabel yang tipenya diinferensikan, Scala mempertahankan tipe union tersebut. Perhatikan bahwa beberapa operasi memperlebar tipe menjadi batas atas terkecil, jadi berikan anotasi jika ingin mempertahankan union.

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)

Kapan Menggunakan Masing-Masing

Pilih alat yang tepat.

  • Union: nilai merupakan salah satu dari beberapa tipe (OR).
  • Irisan: nilai memenuhi beberapa trait sekaligus (AND).
  • Union menghindari tipe pembungkus; irisan menghindari pewarisan yang terlalu dalam.
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)

Pemeriksaan Singkat

Uji pemahaman Anda tentang tipe union dan tipe irisan.

Ringkasan

Anda telah mempelajari tipe union dan tipe irisan Scala 3.

  • A | B: nilai merupakan A atau B, tanpa pembungkus atau induk bersama.
  • A & B: nilai merupakan A dan B sekaligus; bersifat komutatif.
  • Gunakan pencocokan pola untuk mempersempit union; gabungkan trait dengan irisan.
  • Gunakan alias type untuk menamai union 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)))

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Tipe Union dan Irisan” gratis?

Ya — teks lengkap “Tipe Union dan Irisan” 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 “Tipe Union dan Irisan”?

Fitur tipe baru 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 4 dari 4.

Berapa lama pelajaran “Tipe Union dan Irisan” 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. Indentasi Signifikan
  2. Enum di Scala 3
  3. Tipe Opaque
  4. Tipe Union dan Irisan
← Kembali ke Scala for Backend Engineering & Functional Programming