Как стать автором
Обновить

Комментарии 10

я начинающий rustacean, не лучше ли реализовать трейт Into<FooReady>?

    impl Into<FooReady> for FooInit {
        fn into(self) -> FooReady {
            FooReady { c: self.a + self.b }
        }
    }
// ...
    let foo: FooReady = foo_system::FooInit::new()
        // Подготавливаем данные в поле 'a'
        .set_a(1)
        // Подготавливаем данные в поле 'b'
        .set_b(2)
        .into();

Да, для конверсий стоит использовать именно трейты From и Into.

Единственное, что из этой пары следует реализовывать именно From, поскольку Into в таком случае реализуется автоматически (обратное неверно), то есть:

impl From<FooInit> for FooReady {
    fn from(init: FooInit) -> Self {
        Self { c: init.a + init.b }
    }
}

Также стоит обратить внимание на трейты TryFrom и TryInto, которые также используются для конверсий, но на этот раз таких, которые могут быть неуспешными (они, кстати, также автоматически реализуются с типом невозможной ошибки Infallible, если реализованы обычные конверсии From).

Спасибо! Использование трэйтов это немного глубже, хотя и интереснее. Статья рассчитана на начинающих, переходящих с языков без жёсткой типизации для пояснения использования отдельных типов для хранения состояний и переходов между ними с использованием методов. Статья ни в коем случае не претендует на полноту изложения и идеальную полномасштабную реализацию . Концептуально она отражает расширенный вариант документации.

Не понятно как это все вообще относится к конечным автоматам. Где множество состояний и грамматика/алфавит? Ещё понятно, когда на Rust в качестве примера приводят пару enum или enum и строку, но это, простите, что?

Понимаю праведный гнев математика, однако: терминами алфавита и грамматики пользуются хоть и часто, но это не является единственным описанием и типом применения конечных автоматов. Речь не о математике, а о применении индивидуальных типов как хранилища состояния и поведения системы в конкретном языке программирования вместо Enum или любых других элементарных типов (строк, чисел, булевых значений).

К конечным автоматам описание имеет следующее отношение:

* конечный автомат это модель системы имеющий один вход и один выход

* в каждый момент времени находящийся в одном состоянии - реализуется типом FooInit / FooReady

* на вход системы поступают входные воздействия - вызов методов

* на выходе системы формируются выходные сигналы - результаты исполнения этих методов

Конечный автомат это система имеющая внутренее состояние, и произвольное (но определённое) количество входов и выходов. Почитайте по ссылке

Автоматное программирование – новая веха или миф? Часть 1. Введение https://habr.com/p/331556/

Особо заинтересованным в теме стоит ознакомиться с этим постом. Работа с конечными автоматами рассмотрена куда глубже

Спасибо за полезную ссылку. Побольше бы статей на русском языке.

Ее уже перевели кстати

Конечные автоматы не такаю уж и сложная тема (если не лезть в дебри типа композиций автоматов, построения автоматов по данным ввода-вывода и доказывания эквивалентности)

Вики вам в помощь https://ru.wikipedia.org/wiki/Конечный_автомат

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории