HowProgrammingWorks / HowProgrammingWorks/EventEmitter
Rust emit
未关闭
还没有人认领这个 Issue。
- 主要语言
- JavaScript
- 星标
- 23
- 派生
- 25
- PR 合并指标
- 30 天内没有已合并 PR
描述
I wrote this based on this, but did not get how the pub fn on<F>(&mut self, event: T, handler: F) is working, and how it got fired by calling handler(&payload) in the emit can you explain little bit pls. thanks
use std::collections::HashMap;
use std::cmp::Eq;
use std::hash::Hash;
#[derive(Debug, Copy, Clone, Hash, Eq, PartialEq)]
enum GreetEvent {
SayHello,
SayBye,
}
type HandlerPtr<T> = Box<dyn Fn(&T)>; // Vec<Arc<dyn EventListener>>; //
pub struct EventEmitter<T: Hash + Eq, U> {
handlers: HashMap<T, Vec<HandlerPtr<U>>>,
}
impl<T: Hash + Eq, U> EventEmitter<T, U> {
/// Creates a new instance of `EventEmitter`.
pub fn new() -> Self {
Self {
handlers: HashMap::new(),
}
}
/// Registers function `handler` as a listener for `event`. There may be
/// multiple listeners for a single event.
pub fn on<F>(&mut self, event: T, handler: F)
where
F: Fn(&U) + 'static,
{
let event_handlers =
self.handlers.entry(event).or_insert_with(|| vec![]);
event_handlers.push(Box::new(handler));
}
/// Invokes all listeners of `event`, passing a reference to `payload` as an
/// argument to each of them.
pub fn emit(&self, event: T, payload: U) {
if let Some(handlers) = self.handlers.get(&event) {
for handler in handlers {
handler(&payload);
}
}
}
}
fn main() {
let mut emitter = EventEmitter::new();
emitter.on(GreetEvent::SayHello, |name| {
println!("Hello, {}!", name);
});
emitter.on(GreetEvent::SayHello, |name| {
println!("Someone said hello to {}.", name);
});
emitter.on(GreetEvent::SayBye, |name| {
println!("Bye, {}, hope to see you again!", name);
});
emitter.emit(GreetEvent::SayHello, "Alex");
emitter.emit(GreetEvent::SayBye, "Alex");
}
贡献指南
这个仓库没有索引到贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
先从 Rust Playground 示例和 issue 中链接的 EventEmitter Rust 实现开始,然后阅读所示的 EventEmitter::on 和 emit 方法。说明泛型 F、Box<dyn Fn(&U)> 与 handler(&payload) 调用之间的关系,并使用 main 示例进行完成检查。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- rust
- 领域
- documentation
- Issue 类型
- 文档
- 难度
- 1/5
- 预计耗时
- 1 小时以内
- 活跃度
- 停滞
- 描述清晰度
- 需要澄清
- 新手友好度
- 15/100