172 похожих чатов

Товарищи, есть структура Device вида pub struct Enable; pub struct Disable; pub

trait State {}
impl State for Enable {}
impl State for Disable {}

pub struct Device<EnableState: State > {
_enable: std::marker::PhantomData<EnableState>,
}
такой механизм позволяет реализовать разный функционал для разных состояний Device и проверка корректности вызовов будет на этапе компиляции

impl Device<Disable> { pub fn enable(self) -> Device<Enable> { ... } }
impl Device<Enable> { pub fn disable(self) -> Device<Disable> { ... } }

но Device<Disable> и Device<Enable> это же разные типы?
я не могу хранить в структуре просто Device
struct SDK {
dev: Device
}
компилятор требует указать явно Device< ... >

если использовать dev: Any, то придется использовать проверку типа в нем, что проверяется не на этапе компиляции..
Как можно использовать этот механизм чтобы гарантировать корректность вызова функций в зависимости от состояния на этапе компиляции?

когда мы просто делаем
let dev = Device::new());
let dev = dev.enable();
let dev = dev.disable();
let dev = dev.disable(); // ошибка на этапе компиляции

В таком виде эти гарантии есть на этапе компиляции, но мы создаем новую переменную dev...
А как можно этот механизм использовать внутри структуры?
Чтобы было как-то так:

let sdk = SDK{ dev: Device::new() };
sdk.dev = dev.enable();
sdk.dev = dev.disable();
sdk.dev = dev.disable(); // ошибка на этапе компиляции

2 ответов

11 просмотров

а откуда тут dev берётся то? который справа постоянно

а почему не хочешь: sdk.dev = sdk.dev.disable() sdk.dev = sdk.dev.enable() ?

Похожие вопросы

Обсуждают сегодня

Вопрос по диагностике ошибок (я знаю в чем, в данном конкретном примере, я знаю, как исправить, пример модельный, понятно, что в реальности бывает намного запутаннее). module...
ⰄⰎⰋⰐⰐⰑⰛⰤⰧⰧⰩⰄ ⰊⰑⰁⰓⰡⰛⰦⰕⰫ
10
А чем вам питонисты не угодили?😂
.
79
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
52
А дальше что?.. Записать в файл, потом в Код?.. И потом разбирать как-то?..
Хаскель Моисеевич Гопник
14
доброго времени. db, dw и прочие исполняются при трансляции или при выполнении программы?
lutayyy
10
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
например asm AT&T ... label: .string "hi" ... # not error lea label(%rip), %rax # error ( not compile ) mov %rip, %rax # not error mov (%rip), %rax из форумов прочитал чт...
Simple Sorcerer
6
Почему никто не подсказал, что можно объявить свои типы данных, в которых меньше полей, чем в отданном джейсоне, и добавлять их по необходимости?
Strange Rabbit
10
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
86
Есть предложения, как подобное можно упростить?
Hemul GM
12
Карта сайта