Compare commits
2 Commits
fb6d440914
...
a699cfaba1
| Author | SHA1 | Date | |
|---|---|---|---|
| a699cfaba1 | |||
| 1d4b6b265d |
45
practice/src/bin/m_node.rs
Normal file
45
practice/src/bin/m_node.rs
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
use std::cell::RefCell;
|
||||||
|
use std::rc::{Rc, Weak};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Node {
|
||||||
|
value: i32,
|
||||||
|
parent: RefCell<Option<Weak<Node>>>, // <-- weak ref to parent
|
||||||
|
children: RefCell<Vec<Rc<Node>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Node {
|
||||||
|
fn new(value: i32) -> Rc<Self> {
|
||||||
|
Rc::new(Self {
|
||||||
|
value,
|
||||||
|
parent: Default::default(),
|
||||||
|
children: Default::default(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_parent(&self, parent: Rc<Node>) {
|
||||||
|
*self.parent.borrow_mut() = Some(Rc::downgrade(&parent)); // <-- create weak ref to parent
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_child(self: &Rc<Self>, child: Rc<Node>) {
|
||||||
|
child.set_parent(self.clone());
|
||||||
|
self.children.borrow_mut().push(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for Node {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
println!(
|
||||||
|
"Dropping node with value {} and {} children",
|
||||||
|
self.value,
|
||||||
|
self.children.borrow().len()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let tree = Node::new(1);
|
||||||
|
tree.add_child(Node::new(3));
|
||||||
|
tree.add_child(Node::new(5));
|
||||||
|
println!("Finishing program now");
|
||||||
|
}
|
||||||
@@ -55,3 +55,55 @@
|
|||||||
- Приложение-пример успешно выполняется и выводит отчёт о доме.
|
- Приложение-пример успешно выполняется и выводит отчёт о доме.
|
||||||
- Команды cargo clippy и cargo fmt --check не выводят ошибок и предупреждений.
|
- Команды cargo clippy и cargo fmt --check не выводят ошибок и предупреждений.
|
||||||
- Присутствуют и успешно выполняются модульные тесты.
|
- Присутствуют и успешно выполняются модульные тесты.
|
||||||
|
|
||||||
|
## ДЗ 2026-01-20
|
||||||
|
|
||||||
|
Дорабатываем умный дом
|
||||||
|
|
||||||
|
### Цель:
|
||||||
|
|
||||||
|
Дорабатываем функционал умного дома, используя возможности стандартной библиотеки.
|
||||||
|
|
||||||
|
### Срок:
|
||||||
|
|
||||||
|
Сдать до: **2026-02-11**
|
||||||
|
|
||||||
|
### Описание/Пошаговая инструкция выполнения домашнего задания:
|
||||||
|
|
||||||
|
Добавить обработку ошибок:
|
||||||
|
- [ ] Заменить паники на возврат Option в методах получения комнаты по ключу.
|
||||||
|
- [ ] Заменить паники на возврат Option в методах получения устройства по ключу.
|
||||||
|
|
||||||
|
Доработать хранение объектов:
|
||||||
|
- [ ] Заменить массивы устройств и комнат на ассоциативные коллекции из std. В качестве ключей использовать строки.
|
||||||
|
- [ ] Реализовать трейт Debug на всех типах.
|
||||||
|
- [ ] Добавить возможность динамически добавлять/удалять устройства в комнату.
|
||||||
|
- [ ] Добавить возможность динамически добавлять/удалять комнату в дом.
|
||||||
|
- [ ] Добавить в тип умного дома метод, позволяющий сразу получить ссылку на умное устройство. Метод принимает имя комнаты
|
||||||
|
и имя устройства. В случае, если устройство или комната не найдены, возвращать тип ошибки, сообщающий, что именно
|
||||||
|
произошло. Тип ошибки должен реализовывать трейт `std::error::Error`.
|
||||||
|
- [ ] Добавить реализации трейта `From`, позволяющие преобразовывать объекты умной розетки и умного термометра в объект
|
||||||
|
умного устройства.
|
||||||
|
- [ ] Написать макрос для упрощенного создания комнаты, принимающий пары вида (ключ, объект умной розетки) или (ключ,
|
||||||
|
объект умного термометра) и возвращающий объект комнаты, содержащей все перечисленные устройства с
|
||||||
|
соответствующими ключами.
|
||||||
|
|
||||||
|
Доработать формирование отчёта:
|
||||||
|
- [ ] Вынести метод формирования отчёта в трейт и реализовать его на всех типах, которые возвращают отчёт: умное устройство,
|
||||||
|
комната, дом.
|
||||||
|
|
||||||
|
Привести тесты в соответствие с новым функционалом.
|
||||||
|
|
||||||
|
Доработать приложение-пример:
|
||||||
|
- [ ] Продемонстрировать возможность динамического добавления/удаления комнат.
|
||||||
|
- [ ] Продемонстрировать возможность динамического добавления/удаления устройств.
|
||||||
|
- [ ] Добавить функцию, которая принимает любой объект, умеющий выводить отчёт. Вывести с её помощью отчёты о доме,
|
||||||
|
отдельной комнате, отдельном устройстве.
|
||||||
|
- [ ] Продемонстрировать возможность обработки ошибок.
|
||||||
|
|
||||||
|
**Критерии оценки**:
|
||||||
|
|
||||||
|
- Package успешно собирается.
|
||||||
|
- Приложение-пример успешно выполняется и выводит отчёт о доме.
|
||||||
|
- Команды cargo clippy и cargo fmt --check не выводят ошибок и предупреждений.
|
||||||
|
- Присутствуют и успешно выполняются модульные тесты.
|
||||||
|
|||||||
Reference in New Issue
Block a user