6 个版本 (3 个破坏性更新)
0.4.1 | 2022年10月8日 |
---|---|
0.4.0 | 2022年10月5日 |
0.3.0 | 2022年10月4日 |
0.2.0 | 2022年9月29日 |
0.1.1 | 2022年9月26日 |
#23 in #union
25KB
590 行
Coproduct
你是否曾遇到过这样的情况,你想有两个枚举,但只有少数几个变体不同?通常这涉及到大量的重复和模板代码。不再是了!积产品允许你轻松地描述它们并在它们之间进行转换!
use coproduct::{Coproduct, MkUnion, Union};
#[derive(Debug)]
struct A;
#[derive(Debug)]
struct B;
#[derive(Debug)]
struct C;
#[derive(Debug)]
struct D;
type ABC = MkUnion!(A, B, C);
fn main() {
let abc: Coproduct<ABC> = Coproduct::inject(A);
let abcd: Coproduct<Union<D, ABC>> = abc.embed();
println!("{:?}", abcd);
}
更多详情请参阅文档。
lib.rs
:
Rust 枚举是积产品,但这个库提供的数据结构允许编写操作泛型积产品的函数。
例如,以下函数可以接受任何可能包含猫的积产品。
fn is_cat<C, I>(maybe_cat: C) -> bool
where
C: coproduct::At<I, Cat>,
{
maybe_cat.uninject().is_ok()
}
积产品占用的内存与最大的变体相同,加上32位的标签,这几乎是最佳状态。它们不受益于 Rust 的枚举布局优化,但这个 crate 的整个原因就是那些优化并不完美。将积产品实现为类似纯函数列表的嵌套枚举会导致极端的内存使用。(在 Rust 1.66 上测试)
另一个好处是,当不需要假装遍历嵌套结构时,一些函数的实现会更加简单。缺点是,与 frunk 提供的积产品不同,这个库使用了不安全代码。