HowProgrammingWorks / HowProgrammingWorks/EventEmitter
Rust emit
オープン
まだ誰も着手していません。
- 主要言語
- 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 にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- 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