Комментарии 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/Конечный_автомат
Реализация конечных автоматов через систему типов Rust