1 个不稳定版本

使用旧的 Rust 2015

0.3.0 2017年12月2日

#4#评估


用于 2 个 crate(通过 ferrum

MIT 许可证

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