3 个版本
0.0.3 | 2020年4月18日 |
---|---|
0.0.2 | 2020年4月18日 |
0.0.1 | 2020年4月18日 |
#1489 in Rust 模式
25KB
306 行
edisp
针对 Rust 枚举的调度-on-collect。
这个软件包允许根据枚举的变体从迭代器中调度枚举,而不产生运行时开销。
注意:此文档描述了应该做什么,而不是软件包的当前状态。这里描述的每个功能都将首先在第一个beta版本之前实现。
在 std
枚举上的调度
此软件包为在 std
中定义的枚举提供调度。值可以收集在任何实现了 Default
和 Extend
特性的类型中。这种调度由为每个枚举生成的特质构成,可以在每个 Iterator
上调用,如下所示
use edisp::prelude::*;
// Use your regular iterator
let iter = vec![
Ok(42),
Ok(0),
Err("User not found"),
Err("System error"),
].into_iter();
// Call the correct method, and that's all!
let (some_successes, some_errors): (Vec<_>, Vec<_>) = iter.dispatch_result();
assert_eq!(some_successes, vec![42, 0]);
assert_eq!(some_errors, vec!["User not found", "System error"]);
在其他软件包的枚举上的调度
调度代码通过 derive
宏或声明性宏生成。第一种方法允许快速生成样板代码,而无需两次写入枚举名称和变体。第二种方法允许消除过程宏依赖项,即 syn
和 quote
,并减少编译时间。
然后,值可以收集在任何实现了 Default
和 Extend
特性的类型中。
使用 derive
宏
注意:此功能目前不可用。它将在第一个beta版本之前实现。
此软件包提供了一个自定义的 derive
宏,允许自动实现调度所需的特质,如下面的代码片段所示
use edisp::prelude::*;
#[derive(Dispatch)]
enum MyOwnEnum<T> {
Character(char),
Custom(T),
}
// Practical use-case:
// First, create an iterator of `MyOwnEnum<&'static str>`
let iter = vec![
MyOwnEnum::Character('λ'),
MyOwnEnum::Custom("horse"),
MyOwnEnum::Custom("manatee"),
MyOwnEnum::Character('!'),
].into_iter();
// Then call it
let (some_characters, some_strs): (Vec<_>, Vec<_>) = MyOwnEnum::dispatch(iter);
// And it does what you expect!
assert_eq!(
some_characters,
vec!['λ', '!'],
);
assert_eq!(
some_strs,
vec!["horse", "manatee"],
);
注意:此功能目前未实现,因此无法关闭。
可以通过禁用 derive
功能来禁用自定义 derive 功能。
使用声明性宏
此软件包提供了一个名为 implement_dispatch
的宏。它允许生成调度所需的特质。一切都将这样完成
use edisp::prelude::*;
enum MyOwnEnum<T> {
Character(char),
Custom(T),
}
// Implements the required trait (in this case, CollectDispatch2)
implement_dispatch!(
MyOwnEnum<T>,
Character(char),
Custom(T),
);
// Practical use-case:
// First, create an iterator of `MyOwnEnum<&'static str>`
let iter = vec![
MyOwnEnum::Character('λ'),
MyOwnEnum::Custom("horse"),
MyOwnEnum::Custom("manatee"),
MyOwnEnum::Character('!'),
].into_iter();
// Then call it
let (some_characters, some_strs): (Vec<_>, Vec<_>) = MyOwnEnum::dispatch(iter);
// And it does what you expect!
assert_eq!(
some_characters,
vec!['λ', '!'],
);
assert_eq!(
some_strs,
vec!["horse", "manatee"],
);
许可证:MIT OR Apache-2.0