#枚举 #调度

edisp

针对 Rust 枚举的调度-on-collect

3 个版本

0.0.3 2020年4月18日
0.0.2 2020年4月18日
0.0.1 2020年4月18日

#1489 in Rust 模式

MIT/Apache

25KB
306

edisp

针对 Rust 枚举的调度-on-collect。

这个软件包允许根据枚举的变体从迭代器中调度枚举,而不产生运行时开销。

注意:此文档描述了应该做什么,而不是软件包的当前状态。这里描述的每个功能都将首先在第一个beta版本之前实现。

std 枚举上的调度

此软件包为在 std 中定义的枚举提供调度。值可以收集在任何实现了 DefaultExtend 特性的类型中。这种调度由为每个枚举生成的特质构成,可以在每个 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 宏或声明性宏生成。第一种方法允许快速生成样板代码,而无需两次写入枚举名称和变体。第二种方法允许消除过程宏依赖项,即 synquote,并减少编译时间。

然后,值可以收集在任何实现了 DefaultExtend 特性的类型中。

使用 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

没有运行时依赖