1 个稳定版本
1.0.0 | 2022年12月16日 |
---|
#2841 在 Rust 模式
11KB
161 行
Blue TypeMap
这是一个从这里复制的 TypeMap 系统,可用于创建更简洁的 API 的动态函数参数。
它与 Bevy 和 Actix Web 使用的类似,现在你可以在自己的项目中使用它。我将它做成一个包的原因是在学习这个主题时感到沮丧,这样其他人就不必经历这个过程。强烈建议阅读上面的博客以获取更多信息。
示例用法
use blue_typemap::mutable::{Data, TypeMap, Data};
fn function1() {
println!("no parameter");
}
fn function2(data: Data<u32>) {
// be sure to use .get() to obtain the value
let data = data.get();
println!("an int {}", data);
}
fn function3(data: Data<&str>) {
println!("a str {}", data.get());
}
fn function4(mut data: DataMut<i32>) {
// they're sent as mutexguards and have deref, so can easily change values of,
// thanks to help from bruh![moment] at Rust Programming Language discord server on thread
// `Typemap dependency injection mutation`.
let mut x = data;
*x *= 2;
}
fn main() {
// Create a TypeMap container
let mut container = TypeMap::default();
// Bind values to it
container.bind(Data::new("Values"));
container.bind(Data::new(vec!["name", "age", "birth"]));
container.bind(Data::new(50u32));
// Mutable values
container.bind(DataMutStorage::new(10i32));
// Call the functions
container.call(function1);
container.call(function2);
container.call(function3);
container.call(function4);
// Works with closures too
container.call(|fields: Data<Vec<&str>>| {
for i in fields.get() {
println!("Field: {}", i);
}
});
}
额外细节
目前它的速度非常非常慢,显然,比正常函数和函数调用慢得多。开销很大,使得它在性能至关重要的程序中不适用。因此,只在性能不是那么重要的情况下使用它。
目前支持大约20个参数。你可以通过运行 callable_tuple!
和 tuple_from_tm!
宏来增加它,继续在 src/lib.rs
中它们所写的后面。并不是所有类型都受支持,所以你可能需要为你的类型实现 FromTypeMap<'a>
。
祝您旅途愉快!