#extensible #lazily #traits #interface #type #struct #evaluated

插件

可扩展类型的延迟评估、顺序无关插件

11 个版本

使用旧的 Rust 2015

0.2.6 2015年4月22日
0.2.5 2015年4月3日
0.2.4 2015年3月31日
0.2.2 2015年2月28日
0.0.0 2014年11月11日

3#evaluated

Download history 2280/week @ 2024-02-26 2296/week @ 2024-03-04 1947/week @ 2024-03-11 2263/week @ 2024-03-18 2160/week @ 2024-03-25 3071/week @ 2024-04-01 1859/week @ 2024-04-08 2170/week @ 2024-04-15 2311/week @ 2024-04-22 2772/week @ 2024-04-29 2394/week @ 2024-05-06 1871/week @ 2024-05-13 2435/week @ 2024-05-20 2541/week @ 2024-05-27 2483/week @ 2024-06-03 2192/week @ 2024-06-10

9,846 每月下载量
183 包中使用(19 个直接使用)

MIT 许可证

8KB
113

插件

针对可扩展类型的类型安全、延迟评估插件

插件为混合方法提供了一个一致的接口。您可以在使用“混合”特质和实现的地方使用插件。

示例用法

// Define a struct.
struct IntPlugin;

// Map it onto an `i32` value.
impl Assoc<i32> for IntPlugin {}

// Define the plugin evaluation function.
// `Extended` is a type that implements `Extensible`.
impl PluginFor<Extended, i32> for IntPlugin {
    fn eval(_: &Extended, _: Phantom<IntPlugin>) -> Option<i32> {
        Some(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>();

依赖项

~29KB