CodeBlanks Logo Icon CodeBlanks

Generic enum

Option<T> gibi generic enum tanımlarsın.

Generic enum

En çok kullandığın iki enum generic'tir:

enum Option<T> {
    Some(T),
    None,
}

enum Result<T, E> {
    Ok(T),
    Err(E),
}

Kendi generic enum'ını da yazabilirsin. Örneğin bir aramanın sonucunu, aranan değerin türünden bağımsız ifade etmek için:

enum Sonuc<T> {
    Bulundu(T),
    Yok,
}

Generic enum'a metot

Generic enum'a da impl<T> ile metot yazılır; trait sınırı içerikle ne yapılabileceğini belirler:

use std::fmt::Display;

impl<T: Display> Sonuc<T> {
    fn goster(&self) -> String {
        match self {
            Sonuc::Bulundu(v) => format!("bulundu: {v}"),
            Sonuc::Yok => String::from("yok"),
        }
    }
}

Uygulama Arama sonucu

Yukarıdaki Sonuc<T> enum'ını ve goster metodunu yaz. Sonuc::Bulundu(42) ve Sonuc::<&str>::Yok için sonuçları | ile ayırarak yazdır.

Başlangıç kodu

main.rs
use std::fmt::Display;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::fmt::Display;

enum Sonuc<T> {
    Bulundu(T),
    Yok,
}

impl<T: Display> Sonuc<T> {
    fn goster(&self) -> String {
        match self {
            Sonuc::Bulundu(v) => format!("bulundu: {v}"),
            Sonuc::Yok => String::from("yok"),
        }
    }
}

fn main() {
    let a = Sonuc::Bulundu(42);
    let b = Sonuc::<&str>::Yok;
    println!("{} | {}", a.goster(), b.goster());
}

Beklenen çıktı

bulundu: 42 | yok

Soru ve cevaplar

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

1 <code>let s = Sonuc::Yok;</code> neden tek başına derlenmez?

  • Enum'lar generic olamaz
  • Derlenir
  • T çıkarılamıyor; Sonuc::<i32>::Yok gibi belirtilmeli Doğru cevap
  • Yok geçersiz variant

Açıklama: Yok variant'ı T hakkında bilgi taşımaz; tür ya açıkça yazılır ya da sonraki kullanımdan çıkarılır.

2 Türü belirt

Soru
let s = Sonuc::____::Yok;
Cevap
let s = Sonuc::<i32>::Yok;

Açıklama: Turbofish sözdizimi ::<T> ile tür açıkça verilir.

3 Değer ve türü

Kavram Anlamı
Some(5) Option<i32>
Ok::<u8, String>(1) Result<u8, String>
Sonuc::Bulundu("a") Sonuc<&str>
Sonuc::<f64>::Yok Sonuc<f64>

Orta seviye bölümündeki tüm dersler