2 个版本
0.1.1 | 2019年4月13日 |
---|---|
0.1.0 | 2019年4月13日 |
在 Rust 模式 中排名第 2136
15KB
222 行代码(不含注释)
未来联合
当你使用 impl 特性,特别是与 futures 一起使用时,有时你将需要一个分支表达式(例如 if
或 match
),其中不同的分支返回不同的类型,这些类型都实现了 Future。由于当前稳定版 Rust 中 impl 特性只能引用一个类型,所以这不起作用。
解决这个问题的一个方案是使用 futures::future::Either
将所有不同的可能 futures 组合到一个类型中返回。手动这样做真的很麻烦,并且在改变可能分支的数量时需要大量更改。
这个宏 future_union
自动执行此操作。目前你仍然必须保持每个函数的总数,以及索引(从 0 开始)。如果这些值不准确,那么你将得到可怕的类型错误。
示例
use futures::future::{self, Future};
use future_union::future_union;
fn impl_demo(n: usize) -> impl Future<Item=(), Error=()> {
match n {
0 => future_union!(3, 0, future::ok(())),
1 => future_union!(3, 1, future::ok(()).map(|_| ())),
_ => future_union!(3, 2, future::ok(()).map(|_| ()).map(|_| ())),
}
}
未来计划
- 支持 futures-0.3
- 实现一个函数属性宏,该宏检测给定函数中的
future_union
调用,并自动添加正确的计数和索引,例如:use futures::future::{self, Future}; use future_union::*; #[future_union_fn] fn impl_demo(n: usize) -> impl Future<Item=(), Error=()> { match n { 0 => future_union_auto!(future::ok(())), 1 => future_union_auto!(future::ok(()).map(|_| ())), _ => future_union_auto!(future::ok(()).map(|_| ()).map(|_| ())), } }
欢迎贡献!
许可证
许可如下:
- Apache 许可证 2.0 版(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非你明确声明,否则任何有意提交以包含在你提交的工作中的贡献,如 Apache-2.0 许可证中定义的,应按上述方式双许可,不附加任何额外条款或条件。
依赖关系
约 2MB
约 46K SLoC