statig
发布,事件驱动系统的分层状态机(使用GAT开发)
大家好! 我很高兴地宣布 statig,一个帮助你编写分层状态机(也称为 HSM 或statecharts)的crate。这些是由《Practical UML Statecharts in C/C++》一书介绍给我的(不要让UML吓到你),从那时起,我就在思考如何在Rust中最好地实现它们。
HSM最重要的优点是它允许你添加超级状态,定义底层状态的共享行为。随着状态机规模的增长,我发现这个功能在控制复杂性和避免状态爆炸方面变得非常有价值。除此之外,HSM还包括一些概念,如进入/退出动作、状态本地存储和共享上下文,这有助于避免代码重复,反过来也使系统更容易维护。
我在设计上经历了多次迭代,最终得出了一个(至少对我来说)感觉干净且易于维护的设计。但当然我带有我的偏见,我很想听听其他人的看法。所以,如果这一切听起来你很感兴趣,请一定要看一下它的代码。
一个简单的闪烁状态机:
#[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
🎉。这是该库成立以来最重要的被使用事件之一。System76的工程师们已经为iced做出了很多伟大的改进,同时也在长期存在的问题上取得了突破,这些问题可以使Rust的整个GUI生态系统受益(比如正确的文本渲染!)。
This Week in Rust 468
Rust周报648期
This Week in Rust 468: https://this-week-in-rust.org/blog/2022/11/09/this-week-in-rust-468/
From 日报小组 Cupnfish
社区学习交流平台订阅:
评论区
写评论还没有评论