51 个版本 (27 个重大更新)

0.29.0 2020年6月7日
0.27.0 2020年4月15日
0.14.1 2020年3月31日
0.5.2 2019年12月28日

#6 in #stacked

Download history

每月下载 105 次

LGPL-3.0 许可

31KB
732 行代码

同步和递归事件系统。

简介

事件系统是一组可以接收和发送信号的对象。

revent 中,我们构建了一个名为 [Node] 的东西,其中包含一个感兴趣的对象。该对象可以调用其他 node 中的对象,反过来,这些对象又可以安全地调用其他对象(包括发起者)。这是通过将 &mut self 暂停到节点的内容来实现的。

示例

use revent::Node;

let number = Node::new(123);

number.emit(|n| {
    println!("{}", *n);
    *n = 100;
    println!("{}", *n);
});

有关 [Channel]、[Slot] 和 [Suspend] 的示例,请参阅文档。

意图

此库旨在作为“可挂起的 RefCell”由多个对象使用,这些对象希望在不使用中心中介对象的情况下相互通信。

例如,可以创建一个 revent::Channel<dyn MyTrait>,其中包含感兴趣的对象,每个对象都可以在其自己的处理程序内部做类似以下的事情

use revent::{Channel, Suspend};
trait MyTrait {
    fn function(&mut self, channel: &Channel<dyn MyTrait>);
}

struct MyObject;
impl MyTrait for MyObject {
    fn function(&mut self, channel: &Channel<dyn MyTrait>) {
        // Do something...
        self.suspend(|| {
            channel.emit(|x| {
                x.function(channel);
            });
        });
        // Do something else...
    }
}

上述代码允许对象在其所属的通道上发出信号,甚至可以通过挂起 &mut self 来递归地调用自己,而不进行可变别名。

依赖项

~105KB