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
9,846 每月下载量
在 183 个 包中使用(19 个直接使用)
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