Deneme: linked-list(bağlı liste)

enumların yaygın bir kullanımı bağlı liste oluşturmaktır:

use crate::List::*;

enum List {
    // Cons: Bir öğeyi ve bir pointer'ı sonraki düğüme saran Tuple struct'ı
    Cons(u32, Box<List>),
    // Nil: Bağlı listenin sonunu belirten düğüm
    Nil,
}

// Metotlar bir enum'a eklenebilir
impl List {
    // Boş bir liste oluştur
    fn new() -> List {
        // `Nil`in tipi `List`
        Nil
    }

    // Bir listeyi yok edin, ardından aynı listeyi önünde yeni bir öğeyle döndürün 
    fn prepend(self, elem: u32) -> List {
        // `Cons`ın da tipi List
        Cons(elem, Box::new(self))
    }

    // Listenin uzunluğunu döndürün
    fn len(&self) -> u32 {
        // `self` eşlemelidir, çünkü bu metodun davranışı
        // `self` değişkenine bağlıdır
        // `self` `&List` tipine, ve `*self` `List` tipine sahiptir.
        // `&T` referansındaki eşleme yerine `T` somut tipi tercih edilir
        match *self {
            // Kuyruğun sahipliği alınamıyor, çünkü `self` ödünç alındı(borrow);
            // yerine kuyruğa yeni bir referans alınıyor:
            Cons(_, ref tail) => 1 + tail.len(),
            // Basit durum: Bir boş liste 0 uzunluğa sahiptir.
            Nil => 0
        }
    }

    // Listenin gösterimini (heap allocated(yığın ile ayrılmış)) string olarak döndürür
    fn stringify(&self) -> String {
        match *self {
            Cons(head, ref tail) => {
                // `format!`, `print!`e benzer, ama konsola basmak yerine heap
                // allocated string döndürür
                format!("{}, {}", head, tail.stringify())
            },
            Nil => {
                format!("Nil")
            },
        }
    }
}

fn main() {
    // Boş bir bağlı liste oluştur
    let mut list = List::new();

    // Başa birkaç eleman ekle
    list = list.prepend(1);
    list = list.prepend(2);
    list = list.prepend(3);

    // Listenin son halini göster
    println!("linked list has length: {}", list.len());
    println!("{}", list.stringify());
}

Ayrıca bakın:

Box ve metotlar