HowProgrammingWorks / HowProgrammingWorks/EventEmitter
Rust emit
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- JavaScript
- Star
- 23
- Fork
- 25
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Mô tả
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");
}
Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu với ví dụ Rust Playground và phần triển khai EventEmitter bằng Rust được liên kết trong issue, sau đó đọc các phương thức EventEmitter::on và emit được hiển thị. Giải thích mối liên hệ giữa kiểu generic F, Box<dyn Fn(&U)> và lệnh gọi handler(&payload), sử dụng các ví dụ main để kiểm tra phần hoàn thành.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- rust
- Lĩnh vực
- documentation
- Loại issue
- Tài liệu
- Độ khó
- 1/5
- Thời gian dự kiến
- Dưới một giờ
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Cần làm rõ
- Mức phù hợp với người mới
- 15/100