CodeBlanks Logo Icon CodeBlanks

Variantlar

Enum variantlarını oluşturmayı ve kullanmayı öğrenirsin.

Variant'larla çalışmak

Enum değerleri fonksiyonlara verilir, döndürülür ve match ile ayrıştırılır. match, her variant'ın ele alındığını derleme anında denetler:

fn ters(y: Yon) -> Yon {
    match y {
        Yon::Kuzey => Yon::Guney,
        Yon::Guney => Yon::Kuzey,
        Yon::Dogu => Yon::Bati,
        Yon::Bati => Yon::Dogu,
    }
}

Enum'a yeni bir variant eklersen, onu ele almayan her match derleme hatası verir; böylece unutulan durum kalmaz.

use ile kısaltma ve metotlar

Enum'lara da impl ile metot eklenir. Uzun yazımı azaltmak için variant'lar kapsama alınabilir:

impl Yon {
    fn yatay_mi(&self) -> bool {
        use Yon::*;
        matches!(self, Dogu | Bati)
    }
}

println!("{}", Yon::Dogu.yatay_mi());   // true

matches! makrosu, bir değerin kalıba uyup uymadığını bool olarak döndürür.

Uygulama Ters yön

Yon enum'ı için fn ters(y: Yon) -> Yon fonksiyonunu match ile yaz. ters(Yon::Kuzey) ve ters(Yon::Dogu) sonuçlarını {:?} ile boşlukla ayırarak yazdır.

Başlangıç kodu

main.rs
#[derive(Debug)]
enum Yon {
    Kuzey,
    Guney,
    Dogu,
    Bati,
}

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
#[derive(Debug)]
enum Yon {
    Kuzey,
    Guney,
    Dogu,
    Bati,
}

fn ters(y: Yon) -> Yon {
    match y {
        Yon::Kuzey => Yon::Guney,
        Yon::Guney => Yon::Kuzey,
        Yon::Dogu => Yon::Bati,
        Yon::Bati => Yon::Dogu,
    }
}

fn main() {
    println!("{:?} {:?}", ters(Yon::Kuzey), ters(Yon::Dogu));
}

Beklenen çıktı

Guney Bati

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>Yon::Kuzey == Yon::Kuzey</code> yazmak için ne gerekir?

  • #[derive(PartialEq)] Doğru cevap
  • #[derive(Debug)]
  • Hiçbir şey
  • impl Yon

Açıklama: == operatörü PartialEq trait'ini ister; derive ile otomatik üretilir.

2 Kalıp denetimi

Soru
let y = Yon::Bati;
let yatay = ____(y, Yon::Dogu | Yon::Bati);
Cevap
let y = Yon::Bati;
let yatay = matches!(y, Yon::Dogu | Yon::Bati);

Açıklama: matches! makrosu kalıba uyuyorsa true döndürür.

3 Yazım ve görevi

Kavram Anlamı
match y { .. } Variant'a göre dallanma
matches!(y, ..) bool kalıp testi
use Yon::* Variant'ları kapsama alır
#[derive(PartialEq)] == desteği

Başlangıç bölümündeki tüm dersler

16 Proje: Yapılacaklar listesi

  1. Görev modeli
  2. Ekleme
  3. Listeleme
  4. İşaretleme
  5. Komut okuma