#generic #primitive #generics

nightly pluralize

跨单个和多个元素的泛型特质

2个不稳定版本

0.2.1 2020年2月19日
0.2.0 2020年2月19日
0.1.0 2020年1月15日

#90 in #generics

MIT许可证

22KB
506

Pluralize-rs

Pluralize-rs旨在使Rust的泛型编程能够表达具有泛型数量化元素的类型。一个具有界限 Pluralize<T> 的类型可以是单个原始类型 T,一个 Option<T>,或者一个 Vec<T>。单个Pluralize界限 T 可以通过调用 pluralize( ) 方法进行迭代,同样也可以是一个Pluralize界限的 Vec<T>Option<T>

测试目录中给出的示例相当简单,那么这实际上有什么用呢?想象一下,你有一个完美的单链表,并且你想要一个具有多层链接的链表。你可以简单地使用单链表作为基本模板来编写一个,或者你可以用泛型 T: Pluralize<L> 替换你的链接类型(让我们称它为 L),并用迭代器替换你的链接层交互。通过一点工作坊(主要为了标记链接),你就可以将代码从链表重构成一个图(没有循环)。
这是我编程的目的,但也许这会激发其他更有想象力的人开始一个要么更疯狂要么更实用的项目。

限制

用于复数化单个原始类型的技巧只能产生 ::slice 家族迭代器。据我所知,你不能将其适配到更复杂的结构或迭代方案,所以没有经过大量工作,你不能在没有歧义的树遍历或原始模型中使用。

目前从Pluralize Vec<T>Option<T> 中删除的唯一方法被“Remover”功能锁定,因为Remover依赖于与slice::IterMut相同布局的镜像类型的转换。这不是可移植的行为,实际上任何影响内存布局的东西都可能使这段代码出现异常行为。在jank.rs中有一个测试来保护您免受此影响,如果它失败,则说明有问题,您不应该尝试使用Remover。

目前实现Pluralize覆盖Option<T>的唯一方法被“Options”功能锁定,因为从Option<T>类型中提取slice::Iter需要与Remover相同的镜像实现。同样,确实存在测试来保护您免受异常行为的影响,如果测试失败,请予以注意。

依赖项

~8KB