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(); // ошибка на этапе компиляции
а откуда тут dev берётся то? который справа постоянно
а почему не хочешь: sdk.dev = sdk.dev.disable() sdk.dev = sdk.dev.enable() ?
Обсуждают сегодня