1个不稳定版本
0.1.1 | 2020年2月25日 |
---|---|
0.1.0 |
|
在#pluralize中排名第10
3KB
Pluralize-rs
Pluralize-rs旨在使Rust的泛型编程能够表达具有泛型量化元素的结构的实现。具有界限Pluralize<T>
的类型可以是单个原始类型T
、一个Option<T>
或者一个Vec<T>
。单个Pluralize界限的T
可以通过调用pluralize( )
方法进行迭代,同样也可以是一个Pluralize界限的Vec<T>
或Option<T>
。
测试目录中给出的示例相当简化,那么这实际上有什么用呢?想象一下,你有一个非常好的单链表,你想要一个具有多个链接层的链表。你可以简单地编写一个,使用单链表作为基本模板,或者你可以替换你的链接类型(让我们称它为L),将其替换为泛型T: Pluralize<L>
,并用迭代器替换你的链接层交互。通过一点工作坊(主要是标记链接)你就可以将链表的代码重构为本质上是一个图(无循环)。
这是我正在编写的用途,但也许这会激发其他想象力比我更丰富的人去启动一个项目,这个项目要么更疯狂,要么更实用。
限制
用于单原语复数的技巧只能生成 ::slice 家族迭代器。据我所知,无法将其适应更复杂的结构或迭代方案,因此没有经过大量工作,无法实现模糊的树遍历或原语模型。
目前从 Pluralize
Vec<T>
或 Option<T>
中删除的唯一方法是通过“Remover”功能,因为 Remover
依赖于从具有与 slice::IterMut
相同布局的镜像类型进行转换。这不是可移植的行为,实际上任何影响内存布局的操作都可能使这段代码出现异常行为。在 jank.rs 中有一个测试来保护你免受这种影响,如果它失败,说明有问题,你不应该尝试使用 Remover。
目前将 Pluralize
实现到 Option<T>
的唯一方法是通过“Options”功能锁定,因为从 Option<T>
类型中提取 slice::Iter
需要 Remover
的相同镜像实现。同样,也存在测试来保护你免受异常行为的影响,如果它们失败,你应该注意它们。
依赖项
~1.5MB
~35K SLoC