12个版本
0.0.14 | 2023年9月8日 |
---|---|
0.0.13 | 2023年6月24日 |
0.0.8 | 2023年5月3日 |
0.0.6 | 2023年4月30日 |
0.0.2 | 2023年1月17日 |
#745 in Rust模式
每月下载量78
73KB
1.5K SLoC
hlist2
此crate定义了一种创建编译时异构列表的方法,或由多个类型组成的列表。
异构列表
此crate定义了空列表类型Nil
和列表头及其剩余部分的对类型Cons
。异构列表由许多相互递归包含的cons组成,最后一个cons包含最后一个元素并具有nil作为剩余部分。例如,整数、双精度和布尔值的异构列表可以表示为Cons(1, Cons(2.0, Cons(true, Nil)))
,其类型为Cons<i32, Cons<f64, Cons<bool, Nil>>>
。
递归性质和行为
异构列表的这种递归性质使我们能够递归地实现各种特性,而没有任何关于此类列表大小或其中包含的类型的大小限制。与元组不同,可以为所有异构列表实现特性,甚至为那些元素数量超过12个的列表实现特性,这是元组有时存在的问题。
所有异构列表都实现了HList
特性,因此它可以在泛型中使用。例如,这可能有助于将泛型类型限制为异构列表。要为所有任何大小的异构列表实现您的特性,首先在Nil
类型上实现它,该类型也是HList
。然后,在具有头和尾泛型类型的Cons
结构上实现您的特性,其中尾类型也是异构列表(或实现了HList
特性的类型)。
这些技术的一些示例可以在ops
模块中查看,其中实现了所有异构列表类型的特定操作。例如,要将任何值追加到列表末尾,使用Append
特性;要将任何值 prepending 到列表开头,使用Prepend
特性,依此类推。
构建和破坏异构列表
但是,当尝试给异构列表命名类型或使用异构列表值进行模式匹配时,这种递归性质可能会成为一个问题。为了简化列表的创建和列表类型的命名,该库定义了两个宏,hlist!
和 HList!
。第一个宏应该用于创建异构列表或进行模式匹配,而第二个宏应该用于为异构列表类型命名。
因此,我们不需要像这样编写 Cons(1, Cons(2.0, Cons(true, Nil)))
,而可以编写更易读的表达式,如 hlist![1, 2.0, true]
。
要命名此类列表的类型,我们可以写 HList![i32, f64, bool]
,而不是 Cons<i32, Cons<f64, Cons<bool, Nil>>>
。
元组兼容性
此外,此库还与元组类型具有兼容性。当元组长度为12或更少时,它实现了异构列表与其元组形式的转换,反之亦然。
特性
此库不使用任何不安全代码,以提供与Rust编程语言提供的相同的安全保证。
此库是 no_std
,因此可以在嵌入式环境中自由使用且无需担忧。
灵感
此库旨在成为未维护的 hlist 库的替代品。这也受到了另一个开源库 frunk 的启发。
许可
许可协议为以下之一:
- Apache License,版本2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。