Soru geçmişi:
Rust, açık başlangıç felsefesine bağlıdır. Bazı standart koleksiyonlar ve genel türler için genellikle "varsayılan" bir değere sahip olmak gerekir. Ancak karmaşık yapılar için, parametre olmadan nasıl oluşturulacakları genellikle belirsizdir. Bu amaçla, standart bir yapıcı sağlayan Default trait'i tanıtılmıştır.
Sorun:
Bazen varsayılan bir değerin beklendiği genel konteynerler ve algoritmalar yazmak için, argümanlar geçmeden bir örneğin oluşturulması için bir mekanizma gereklidir. Ancak, tüm türler böyle bir yapı için uygun değildir; bazen varsayılan değer belirsiz ve tehlikeli olabilir.
Çözüm:
default() yöntemini sağlayarak Default trait'ini uygular (genellikle "boş", sıfırlanmış veya ön koşullar ile).Kod örneği:
#[derive(Default, Debug)] yapı Config { retries: u32, verbose: bool, } fn main() { let cfg = Config::default(); println!("{:?}", cfg); }
Anahtar özellikler:
Option<T> için Default::default zorunlu olarak çağrılır mı, eğer T: Default ise?
Hayır, Optional, T için default'u otomatik olarak çağırmaz; unwrap_or_default açıkça çağrılır.
Yapıların yapıcılarında varsayılan değere sahip parametreler Default trait ile belirlenebilir mi?
Hayır, Default yapının tamamını oluşturur, bireysel alanların varsayılanları normal yapıcı sözdizimi ile değiştirilemez.
derive(Default) tüm alanları Default uygulamayan bir yapı için başarısız olabilir mi?
Evet, derive(Default) yalnızca tüm yapı alanları Default'ı uyguluyorsa çalışır.
Config c Default, burada sunucunun portu 0 (geçersiz varsayılan değer). Program beklenmedik bir şekilde yanlış portta çalışıyor.
Artıları:
Eksileri:
Varsayılanın güvenli, uzlaşmalı değerlere sahip bir yapı için ayarları (retries=3, verbose=false) olması.
Artıları:
Eksileri: