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.
This is a common pattern: a struct wrapping a trait implementation and implementing that same trait, adding behavior in the process. In the “Generics” segment, we will see how to make the wrapper generic over the wrapped type.
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"); }