diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..38c9288 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,74 @@ +use std::iter::ExactSizeIterator; + +// Согласно принципам программирования, управляемого данными, +// мы инкапсулируем данные в простые классы (в Rust - структуры)-контейнеры. +// Все методы для работы с данными вынесены в отдельные структуры, которые +// могут быть использованы в другом коде и для других данных с минимальными +// изменениями. +// Таким образом, мы отделяем код от данных. + +// Универсальная структура для хранения итератора общего типа +// (использование именно итератора (с известным размером) требуется +// характеристикой ExactSizeIterator в определении структуры. +struct Contents<T: ExactSizeIterator> { + contents: T, +} + +// Структура данных почтового ящика +struct Mailbox<T: ExactSizeIterator> { + contents: Contents<T>, + unread: bool, +} + +// Структура простого ящика +struct Box<T: ExactSizeIterator> { + volume: u8, + objects: Contents<T>, +} + +// Проверяльщик содержимого контейнера. +// Структура реализует метод is_empty для проверки размера содержимого. +// Работает с нашей общей реализацией структуры-"контейнера" Contents +struct ContainerChecker {} +impl ContainerChecker { + fn is_empty<T: ExactSizeIterator>(data: &Contents<T>) -> bool { + return data.contents.len() == 0; + } +} + +// Проверяльщик почтового ящика. Работает с почтовыми ящиками. +struct MailChecker {} +impl MailChecker { + fn check_mail<T: ExactSizeIterator>(mbox: &Mailbox<T>) { + if mbox.unread { + println!("Есть непрочитанные сообщения!"); + } else { + println!("Непрочитанных писем нет."); + } + } +} + + +fn main() { + let box_contents = Contents {contents: [1, 2, 3, 4].iter()}; + let b = Box { volume: 16, objects: box_contents}; + + if ContainerChecker::is_empty(&b.objects) { + println!("Коробка пуста!"); + } else { + println!("В коробке что-то есть!"); + } + + let mail_contents = Contents {contents: ["Письмо", "Ещё письмо"].iter()}; + let m = Mailbox { contents: mail_contents, unread: true }; + + // тот же проверяльщик, что использовался для проверки ящика, можно + // использовать и для почтового ящика - без всяких наследований. + if ContainerChecker::is_empty(&m.contents) { + println!("Почтовый ящик пуст!"); + } else { + print!("В почтовом ящике есть письма; "); + + MailChecker::check_mail(&m); + } +} |