1 个不稳定版本
使用旧的 Rust 2015
0.3.0 | 2017年12月2日 |
---|
#4 在 #评估
用于 2 个 crate(通过 ferrum)
25KB
440 行
插件
类型安全的懒加载插件,适用于可扩展类型
插件为混合方法提供一致接口。您可以在需要使用“混合”特性和实现的地方使用插件。
示例用法
// Define a struct.
struct IntPlugin;
// Map it onto an `i32` value.
impl typemap::Key for IntPlugin { type Value = i32; }
// Define the plugin evaluation function.
// `Extended` is a type that implements `Extensible`.
impl Plugin<Extended> for IntPlugin {
type Error = ();
fn eval(_: &mut Extended) -> Result<i32, ()> {
Ok(0i32)
}
}
assert_eq!(extended.get::<IntPlugin>().unwrap(), 0i32);
使用特性和实现做同样的事情,可以这样
trait IntProducer {
fn get_int_value(&self) -> Option<i32>;
}
impl IntProducer for Extended {
fn get_int_value(&self) -> Option<i32> {
Some(0i32)
}
}
尽管使用原始特性和实现会更少代码,但插件提供了以下优势
- 自动缓存值。再次调用方法是一个常量时间操作!这在只需要传递可扩展对象到管道结构中特别有用。
- 一致的接口,同时也允许更整洁地解决名称冲突。提供
PluginX
的两个模块可以使用模块前缀来区分。
e.get::<mod1::PluginX>();
e.get::<mod2::PluginX>();
依赖关系
~13KB