1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2018 年 9 月 19 日 |
---|
#2017 在 Rust 模式
11KB
153 行
handler_map
类似于 AnyMap
,但使用函数而不是值
这个包最初是一个随想:“像 AnyMap
这样的包允许你存储每种类型的单个值。存储一个接收该类型的函数(如消息处理器)需要什么?”这就是结果。
基本思想是,你从一个消息类型和一个通过值接收它的函数开始
struct MyMessage;
fn handle_msg(_: MyMessage) {
println!("Got your message!");
}
然后,取一个这样的 HandlerMap
,并传递处理器
let mut map = HandlerMap::new();
map.insert(handle_msg);
这将在处理器中注册该类型,以便以后可以调用它
map.call(MyMessage);
// console prints "Got your message!"
lib.rs
:
包含“处理器映射”的包,这是一个将消息类型与可以通过它们调用的“处理器”映射的结构。
此包的重点是 HandlerMap
类型,它存储有关接收各种类型的函数的信息。这可以用来编码事件处理器、消息处理器或其他需要根据接收到的数据动态选择要调用的函数的情况。
要注册处理器,将其传递给 insert
use handler_map::HandlerMap;
/// Message which prints to the console when received.
struct MyMessage;
fn handle(_: MyMessage) {
println!("got your message!");
}
let mut map = HandlerMap::new();
map.insert(handle);
这会将处理器添加到映射中,以便以后可以调用它
map.call(MyMessage);
该映射还可以接受闭包,只要它们实现了 Fn
并且没有捕获任何环境引用
use handler_map::HandlerMap;
use std::rc::Rc;
use std::cell::Cell;
/// Message which increments an accumulator when received.
struct MyMessage;
let mut map = HandlerMap::new();
let acc = Rc::new(Cell::new(0));
{
let acc = acc.clone();
map.insert(move |_: MyMessage| {
acc.set(acc.get() + 1);
});
}
// call the handler a few times to increment the counter
map.call(MyMessage);
map.call(MyMessage);
map.call(MyMessage);
assert_eq!(acc.get(), 3);
call
可以接受任何类型的消息,即使该类型尚未注册。它返回一个表示是否调用处理器的 bool
。如果映射中已注册该类型的处理器,则返回 true
;否则返回 false
。如果您想检查是否已注册处理器而不调用它,请使用 is_registered
或 val_is_registered
。
如果您想从处理器中删除事件,请调用 remove
use handler_map::HandlerMap;
struct MyMessage;
fn handle_msg(_: MyMessage) {}
let mut map = HandlerMap::new();
map.insert(handle_msg);
assert!(map.is_registered::<MyMessage>());
map.remove::<MyMessage>();
assert!(!map.is_registered::<MyMessage>());