2 个版本
0.1.1 | 2023 年 1 月 21 日 |
---|---|
0.1.0 | 2023 年 1 月 21 日 |
44 在 #const-generics
72KB
1K SLoC
此 crate 旨在防止 str
拆分 API 的组合爆炸。
爆炸来自以下组合
- 反向 (
rsplit
,rsplit_once
,rsplit_terminator
,rsplitn
) - 包含 (
split_inclusive
) - 终止 (
split_terminator
,rsplit_terminator
) - 限制 (
splitn
,rsplitn
) - 一次 (
split_once
,rsplit_once
)
如您所见,目前缺少各种组合(不完整)
- 包含 + 反向
- 包含 + 限制
- 包含 + 一次
- 包含 + 反向 + 限制
- 包含 + 反向 + 一次
此外,可能还需要具有右或左包含版本的。
这可能会迅速增加 str
的 API 表面,这并不理想。
相反,此 crate 实现了一种类型的构建器 API。它以两种不同的方式执行此操作
- 使用 const 泛型参数
- 使用结构组合器
两者都具有几乎相同的 API。使用方式如下
use str_splitter::combinators::SplitExt;
// OR
// use str_splitter::const_generics::SplitExt;
// `split`
let v: Vec<&str> = "lionXXtigerXleopard".splitter('X').collect();
assert_eq!(v, ["lion", "", "tiger", "leopard"]);
// `splitn`
let v: Vec<&str> = "Mary had a little lambda".splitter(' ').with_limit(3).collect();
assert_eq!(v, ["Mary", "had", "a little lambda"]);
// `rsplitn`
let v: Vec<&str> = "lion::tiger::leopard".splitter("::").to_reversed().with_limit(2).collect();
assert_eq!(v, ["leopard", "lion::tiger"]);
// `rsplit_terminator`
let v: Vec<&str> = "A.B.".splitter('.').to_terminated().to_reversed().collect();
assert_eq!(v, ["B", "A"]);
// `rsplit_inclusive_once` if it existed
assert_eq!("cfg=foo=bar".splitter('=').to_inclusive().to_reversed().once(), Some(("cfg=foo", "=bar")));
思路是,由现有 split
方法返回的结构体将添加库中 Splitter
拥有的各种修饰方法。
此 crate 依赖于不稳定 Pattern
特性,因此需要 nightly Rust。