Alıştırma: Kaydedici Özelliği (Logger Trait)
Bir log
metoduna sahip bir Logger
özelliği (trait) kullanarak basit bir kayıt (logging) aracı tasarlayalım. İlerlemesini kaydedebilecek kod daha sonra bir &impl Logger
alabilir. Testte bu, mesajları test kayıt dosyasına (logfile) koyabilirken, bir üretim (production) inşasında mesajları bir kayıt sunucusuna (log server) gönderir.
Ancak, aşağıda verilen StderrLogger
ayrıntı seviyesine (verbosity) bakılmaksızın tüm mesajları kaydeder. Göreviniz, maksimum ayrıntı seviyesi üzerindeki mesajları yoksayacak bir VerbosityFilter
türü yazmaktır.
Bu yaygın bir desendir: bir özellik gerçekleştirmesini (trait implementation) saran ve aynı özelliği gerçekleştiren, süreçte davranış ekleyen bir yapı (struct). “Jenerikler” bölümünde, sarmalayıcıyı (wrapper) sarılmış tür (wrapped type) üzerinde jenerik yapmayı göreceğiz.
trait Logger { /// Belirtilen ayrıntı seviyesinde bir mesaj kaydedin. fn log(&self, verbosity: u8, message: &str); } struct StderrLogger; impl Logger for StderrLogger { fn log(&self, verbosity: u8, message: &str) { eprintln!("ayrıntı seviyesi={verbosity}: {message}"); } } /// Yalnızca belirtilen ayrıntı seviyesine kadar olan mesajları kaydedin. struct VerbosityFilter { max_verbosity: u8, inner: StderrLogger, } // TODO: `VerbosityFilter` için `Logger` özelliğini (trait) gerçekleştirin. fn main() { let logger = VerbosityFilter { max_verbosity: 3, inner: StderrLogger }; logger.log(5, "Bilginiz Olsun"); logger.log(2, "Eyvah"); }