statig
发布,事件驱动系统的分层状态机(使用GAT开发)
大家好! 我很高兴地宣布 statig,一个帮助你编写分层状态机(也称为 HSM 或statecharts)的crate。这些是由《Practical UML Statecharts in C/C 》一书介绍给我的(不要让UML吓到你),从那时起,我就在思考如何在Rust中最好地实现它们。 HSM最重要的优点是它允许你添加超级状态,定义底层状态的共享行为。随着状态机规模的增长,我发现这个功能在控制复杂性和避免状态爆炸方面变得非常有价值。除此之外,HSM还包括一些概念,如进入/退出动作、状态本地存储和共享上下文,这有助于避免代码重复,反过来也使系统更容易维护。 我在设计上经历了多次迭代,最终得出了一个(至少对我来说)感觉干净且易于维护的设计。但当然我带有我的偏见,我很想听听其他人的看法。所以,如果这一切听起来你很感兴趣,请一定要看一下它的代码。
一个简单的闪烁状态机:
代码语言:javascript复制#[derive(Default)]
pub struct Blinky {
led: bool,
}
pub struct Event;
impl StateMachine for Blinky {
type State = State;
type Superstate<'a> = Superstate;
type Event = Event;
const INIT_STATE: State = State::off();
}
#[state_machine]
impl Blinky {
#[state]
fn on(&mut self, event: &Event) -> Response<State> {
self.led = false;
Transition(State::off())
}
#[state]
fn off(&mut self, event: &Event) -> Response<State> {
self.led = true;
Transition(State::on())
}
}
fn main() {
let mut state_machine = Blinky::default().state_machine().init();
state_machine.handle(&Event);
}
Github: https://github.com/mdeloof/statig
Iced
0.5版本发布
Iced
0.5版本在今天正式发布了,具体的改动可以看这里:
改动: https://github.com/iced-rs/iced/pull/1520
最后,值得特别一提的是,System76已经决定在Pop!_OS的桌面环境中使用
iced
而不是GTK