Skip to content

Instantly share code, notes, and snippets.

@rust-play
Created May 30, 2022 07:10
Show Gist options
  • Save rust-play/76dff7177f19ff7e802b1e121865afe4 to your computer and use it in GitHub Desktop.
Save rust-play/76dff7177f19ff7e802b1e121865afe4 to your computer and use it in GitHub Desktop.
Code shared from the Rust Playground
// Метка todo - реализовать самостоятельно
// ***** Пример библиотеки "Умный дом" со статическим содержимым
struct SmartHouse {/* todo: данные умного дома */}
impl SmartHouse {
fn new() -> Self {
todo!("реализовать инициализацию дома")
}
fn get_rooms(&self) -> [&str; 2] {
// Размер возвращаемого массива можно выбрать самостоятельно
todo!("список комнат")
}
fn devices(&self, room: &str) -> [&str; 3] {
// Размер возвращаемого массива можно выбрать самостоятельно
todo!("список устройств в комнате `room`")
}
fn create_report(
&self,
/* todo: принять обобщённый тип предоставляющий информацию об устройствах */
) -> String {
todo!("перебор комнат и устройств в них для составления отчёта")
}
}
trait DeviceInfoProvider {
// todo: метод, возвращающий состояние устройства по имени комнаты и имени устройства
}
// ***** Пример использования библиотеки умный дом:
// Пользовательские устройства:
struct SmartSocket {}
struct SmartThermometer {}
// Пользовательские поставщики информации об устройствах.
// Могут как хранить устройства, так и заимствывать.
struct OwningDeviceInfoProvider {
socket: SmartSocket,
}
struct BorrowingDeviceInfoProvider<'a, 'b> {
socket: &'a SmartSocket,
thermo: &'b SmartThermometer,
}
// todo: реализация трейта `DeviceInfoProvider` для поставщиков информации
fn main() {
// Инициализация устройств
let socket1 = SmartSocket {};
let socket2 = SmartSocket {};
let thermo = SmartThermometer {};
// Инициализация дома
let house = SmartHouse::new();
// Строим отчёт с использованием `OwningDeviceInfoProvider`.
let info_provider_1 = OwningDeviceInfoProvider {
socket: socket1,
};
// todo: после добавления обобщённого аргумента в метод, расскоментировать передачу параметра
let report1 = house.create_report(/* &info_provider_1 */);
// Строим отчёт с использованием `BorrowingDeviceInfoProvider`.
let info_provider_2 = BorrowingDeviceInfoProvider {
socket: &socket2,
thermo: &thermo,
};
// todo: после добавления обобщённого аргумента в метод, расскоментировать передачу параметра
let report2 = house.create_report(/* &info_provider_2 */);
// Выводим отчёты на экран:
println!("Report #1: {report1}");
println!("Report #2: {report2}");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment