From 92cbe56b539d2c8b50915a831b30a5563517345a Mon Sep 17 00:00:00 2001 From: visil Date: Mon, 16 Oct 2023 10:53:15 +0300 Subject: =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.rs | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/main.rs (limited to 'src/main.rs') 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 { + contents: T, +} + +// Структура данных почтового ящика +struct Mailbox { + contents: Contents, + unread: bool, +} + +// Структура простого ящика +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); + } +} -- cgit v1.2.3