< 返回版块

Cupnfish 发表于 2022-11-10 21:50

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

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页