تمرین: Trait Logger
بیایید یک ابزار لاگ ساده طراحی کنیم که از یک trait به نام Logger
با متد log
استفاده کند. کدی که ممکن است پیشرفت خود را لاگ کند میتواند یک impl Logger&
دریافت کند. در زمان تست، این ممکن است پیامها را در فایل لاگ تست قرار دهد، در حالی که در نسخه تولید، پیامها به یک سرور لاگ ارسال میشود.
با این حال، StderrLogger
که در زیر داده شده است، تمامی پیامها را بدون توجه به سطح جزئیات لاگ میکند. وظیفه شما این است که نوع VerbosityFilter
را بنویسید که پیامهایی با سطح جزئیات بالاتر از حداکثر سطح تعیینشده را نادیده بگیرد.
این الگو الگوی رایجی است: یک ساختارکه یک پیادهسازی trait را در بر میگیرد و همان trait را پیادهسازی میکند و در این فرآیند به آن رفتار اضافی میدهد. چه نوعهای دیگری از پوششدهندهها ممکن است در یک ابزار لاگ مفید باشند؟
use std::fmt::Display; pub trait Logger { /// Log a message at the given verbosity level. fn log(&self, verbosity: u8, message: impl Display); } struct StderrLogger; impl Logger for StderrLogger { fn log(&self, verbosity: u8, message: impl Display) { eprintln!("اطلاعات بیشتر={verbosity}: {message}"); } } fn do_things(logger: &impl Logger) { logger.log(5, "FYI"); logger.log(2, "اوهو"); } // TODO: Define and implement `VerbosityFilter`. fn main() { let l = VerbosityFilter { max_verbosity: 3, inner: StderrLogger }; do_things(&l); }