Pattern

1. Pola Logika OR A || B

Cocok dengan salah satu subpola saja; semua cabang harus mendefinisikan kumpulan variabel yang sama persis.

enum Color { red, yellow, blue, green }
void main() {
  Color c = Color.red;
  bool primary = switch(c) {
    Color.red || Color.yellow || Color.blue => true,
    _ => false
  };
  print(primary); // true
}Code language: Dart (dart)

2. Pola Logika AND A && B

Kedua subpola harus cocok secara bersamaan; subpola tidak boleh mengikat variabel dengan nama yang sama.

void main() {
  switch((2, 3)) {
    // Kesalahan: kedua subpola mengikat variabel b, terjadi bentrok nama variabel
    // case (var a, var b) && (var b, var c): print("ok");
    case (var a, var b) && (>1, <5):
      print("a=$a,b=$b"); // a=2,b=3
  }
}Code language: Dart (dart)

Tulisan (>1, <5) berarti angka pertama harus lebih besar dari 1 dan angka kedua harus lebih kecil dari 5.

3. Pola Relasional < > <= >= == !=

Digunakan untuk pengecekan rentang angka, sering digabung dengan && guna membatasi batas nilai

String asciiCharType(int charCode) {
  const space = 32, zero = 48, nine = 57;
  return switch(charCode) {
    < space => "Karakter kontrol",
    == space => "Spasi",
    > space && < zero => "Tanda baca",
    >= zero && <= nine => "Angka",
    _ => "Lainnya"
  };
}
void main() {
  print(asciiCharType(50)); // Angka
  print(asciiCharType(33)); // Tanda baca
}Code language: Dart (dart)

Contoh ini menggunakan kode ASCII untuk mengklasifikasikan karakter kontrol, angka dan simbol. Aturan pengecekan charCode pada switch: kurang dari 32 = karakter kontrol, sama dengan 32 = spasi, antara 32 dan 48 = tanda baca, 48 sampai 57 inklusif = angka, semua nilai lainnya dikategorikan sebagai lainnya.

4. Pola Konversi Tipe Paksa sub as Type

Melakukan konversi tipe eksplisit saat destrukturisasi; jika tipe tidak cocok akan memunculkan pengecualian saat runtime

void main() {
  (num, Object) rec = (10, "hello");
  var (i as int, s as String) = rec;
  print(i + 5); // 15
  print(s.toUpperCase()); // HELLO
}Code language: Dart (dart)

Dalam contoh ini, record rec dipecah menjadi variabel i dan s. Jika elemen pertama bukan bilangan bulat atau elemen kedua bukan string, akan muncul kesalahan runtime.

Lihat contoh yang error di bawah ini:

void main() {
  (num, Object) rec = (9.3, "hello");
  var (i as int, s as String) = rec;
  print(i + 5); // 15
  print(s.toUpperCase()); // HELLO
}Code language: Dart (dart)
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
Unhandled exception:
type 'double' is not a subtype of type 'int' in type cast
#0      main (file:///D:/dartdemo/firstdart/bin/firstdart.dart:3:10)
#1      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:314:19)
#2      _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:193:12)Code language: PHP (php)

5. Pola Pemeriksaan Null sub?

Hanya cocok jika nilai bukan null; variabel di dalamnya otomatis naik tipe menjadi tipe tidak boleh null. Jika bernilai null, pencocokan gagal tanpa memunculkan error.

void main() {
  String? str = "test";
  switch(str) {
    case var s?:
      print(s.length); // s adalah string tidak boleh null, output 4
    case null:
      print("Nilai kosong");
  }
}Code language: Dart (dart)

6. Pola Penegasan Non-Null sub!

Hanya cocok jika nilai bukan null; apabila nilainya null, langsung lempar pengecualian runtime

void main() {
  List<String?> row = ["user", "bob"];
  switch(row) {
    case ["user", var name!]:
      print(name); // name adalah string tidak boleh null
  }

  // Penggunaan pada destrukturisasi variabel
  (int?, int?) pos = (2, 3);
  var (x!, y!) = pos;
  print(x + y);
}Code language: Dart (dart)

Penjelasan var name!

  • var namePola Variabel — kata kunci var mendeklarasikan variabel lokal baru name dan mengikat nilai jika pencocokan berhasil;
  • !Pola Penegasan Null Postfix — mewajibkan nilai saat ini tidak boleh null; jika null akan muncul error runtime.

Makna gabungan: var name! membuat variabel baru name sekaligus menjamin nilainya tidak mungkin null.

7. Pola Konstanta

Literal, konstanta bernama, konstruktor const dan koleksi const semuanya termasuk pola konstanta; akan cocok jika nilainya sama persis

Tipe yang didukung: angka, string, boolean, konstanta bernama, objek / daftar dengan const

void main() {
  const target = 10;
  int num = 10;
  switch(num) {
    case 1: print("Satu");
    case target: print("Cocok dengan konstanta 10");
    case const [1,2]: print("Daftar konstanta");
    default: print("Lainnya");
  }
}Code language: Dart (dart)

Hasil eksekusi program

Cocok dengan konstanta 10

8. Pola Variabel var x / int x / final x

Mengikat variabel lokal baru saat pencocokan berhasil; jika diberi anotasi tipe akan sekaligus validasi tipe nilai

void main() {
  switch((99, "dart")) {
    case (int a, String b):
      print("$a $b"); // 99 dart
    case (int a, int b):
      print("Dua nilai numerik");
  }
}Code language: Dart (dart)

9. Pola Identifikator

Perilakunya terbagi menjadi tiga konteks:

  1. Konteks deklarasi var (a,b):Membuat variabel baru
  2. Konteks penugasan (a,b) = val:Menimpa variabel yang sudah ada
  3. Konteks pencocokan switch:Diperlakukan sebagai konstanta (kecuali _)
void main() {
  const c = 5;
  int val = 2;
  switch(val) {
    case c: print("Cocok dengan konstanta c");
    default: print("Tidak ada kecocokan"); // Baris ini akan dieksekusi
  }
}
Code language: Dart (dart)

10. Pola Kurung (subPattern)

Mengubah prioritas operator pola guna memisahkan urutan evaluasi antara || dan &&

void main() {
  bool x = true, y = true, z = false;
  bool test = switch(true) {
    (x || y) && z => true,
    _ => false
  };
  print(test); // false
}
Code language: Dart (dart)

11. Pola Daftar

Cocok dengan objek List dan memecah elemen berdasarkan posisi; mendukung operator rest ... untuk menangkap sisa elemen berapapun jumlahnya

1. Pencocokan daftar dasar
void main() {
  const a = "a", b = "b";
  var arr = ["a", "b"];
  switch(arr) {
    case [a, b]: print("Kecocokan ditemukan");
    default: print("Tidak ada kecocokan");
  }
}Code language: Dart (dart)
2. Menangkap sisa elemen dengan rest
void main() {
  var [a, b, ...rest, c, d] = [1,2,3,4,5,6,7];
  print("$a $b $rest $c $d"); // 1 2 [3, 4, 5] 6 7
}
Code language: Dart (dart)
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
1 2 [3, 4, 5] 6 7Code language: CSS (css)

12. Pola Map {"key": subP}

Cocok dengan objek Map dan hanya validasi kunci yang ditentukan; jika kunci target tidak ada akan muncul StateError, kunci tambahan yang tidak disebutkan akan diabaikan

void main() {
  var data = {"user": ["Lily", 13]};
  if(data case {"user": [String name, int age]}) {
    print("$name $age"); //Lily 13
  }
}Code language: JavaScript (javascript)

13. Pola Record

Ada dua jenis: record posisi (p1,p2), record bernama (k:p1,k2:p2)

Mendukung singkatan :var untuk menghilangkan nama field yang berulang

void main() {
  // Destrukturisasi record posisi
  var (name, age) = ("Doug", 25);
  // Destrukturisasi singkatan field bernama
  final (:name, :age) = (name: "Tom", age: 18);
}
Code language: JavaScript (javascript)

14. Pola Objek Class(prop: p)

Cocok dengan objek tipe yang ditentukan dan memecah properti getter; tersedia singkatan :var

class Point {
  final int x, y;
  Point(this.x, this.y);
}

void main() {
  Point p = Point(10, 20);
  var Point(:x, :y) = p;
  print("$x $y");
}
Code language: JavaScript (javascript)

15. Pola Wildcard _

Cocok dengan nilai apapun tanpa mengikat variabel; dipakai sebagai pengganti tempat atau hanya validasi tipe tanpa mengambil nilai

void main() {
  var arr = [1,2,3];
  var [_, mid, _] = arr;
  print(mid); // 2

  switch((10, "abc")) {
    case (int _, String _):
      print("Pencocokan tipe berhasil");
  }
}Code language: JavaScript (javascript)

Pattern

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *