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
每月下载 105 次
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