// Проверить код можно здесь: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=f5d0eb6fcf6c995992579ca675263aed use std::iter::ExactSizeIterator; // Согласно принципам программирования, управляемого данными, // мы инкапсулируем данные в простые классы (в Rust - структуры)-контейнеры. // Все методы для работы с данными вынесены в отдельные структуры, которые // могут быть использованы в другом коде и для других данных с минимальными // изменениями. // Таким образом, мы отделяем код от данных. // Универсальная структура для хранения итератора общего типа // (использование именно итератора (с известным размером) требуется // характеристикой ExactSizeIterator в определении структуры. struct Contents { contents: T, } // Структура данных почтового ящика struct Mailbox { contents: Contents, unread: bool, } // Структура простого ящика #[allow(dead_code)] // чтобы компилятор не ругался на неиспользуемое поле struct Box { volume: u8, objects: Contents, } // Проверяльщик содержимого контейнера. // Структура реализует метод is_empty для проверки размера содержимого. // Работает с нашей общей реализацией структуры-"контейнера" Contents struct ContainerChecker {} impl ContainerChecker { fn is_empty(data: &Contents) -> bool { return data.contents.len() == 0; } } // Проверяльщик почтового ящика. Работает с почтовыми ящиками. struct MailChecker {} impl MailChecker { fn check_mail(mbox: &Mailbox) { 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); } }