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
typeuntuk 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
- Indentasi Signifikan
- Enum di Scala 3
- Tipe Opaque
- Tipe Union dan Irisan