1 个不稳定版本
0.1.0 | 2022 年 6 月 29 日 |
---|
2581 在 Rust 模式 中
每月 30 次下载
在 ragegun 中使用
17KB
284 行
词组迭代器
我对任何 NGram 迭代器包都不满意,所以我实现了自己的。这利用了 const 泛型 在编译时确定 NGram 的长度,并支持对任意类型的迭代。
用法
开箱即用,支持 char
、&str
和任何 Option
类型
use ngram_iter as ngram;
use ngram::WORD_JOINER;
// char
let mut chars: ngram::Iter<char, _, 3> = "1234".chars().into();
assert_eq!(chars.next(), Some([WORD_JOINER, '1', '2']));
assert_eq!(chars.next(), Some(['2', '3', '4']));
assert_eq!(chars.next(), Some(['4', WORD_JOINER, WORD_JOINER]));
drop(chars);
// str
let values = vec!["one", "two"];
let mut iter: ngram::Iter<&str, _, 2> = values.iter().map(|s| *s).into();
// Vec<&str>::iter yields &&str, so deref ^^^^^^ to &str
assert_eq!(iter.next(), Some(["\u{2060}", "one"]));
// Option types
let values = vec![Some(1), Some(2)];
let mut iter: ngram::Iter<_, _, 2> = values.iter().map(|v| *v).into();
assert_eq!(iter.next(), Some([None, Some(1)]));
任意类型
支持任意 Copy
类型。
use ngram_iter as ngram;
#[derive(Debug, PartialEq, Clone, Copy)]
enum MyType {
NoData,
SomeData {
x: i32,
y: i32,
},
}
use MyType::*;
impl ngram::Iterable for MyType {
fn bumper_item() -> Self {
NoData
}
}
let values = vec![MyType::SomeData{x: 1, y: 2}, NoData, MyType::SomeData{x: 3, y: 4}, MyType::SomeData{x: 5, y: 6}];
let mut iter: ngram::Iter<_, _, 2> = values.iter().map(|it| *it).into();
assert_eq!(iter.next(), Some([NoData, MyType::SomeData{x: 1, y: 2}]));
assert_eq!(iter.next(), Some([MyType::SomeData{x: 1, y: 2}, NoData]));
assert_eq!(iter.next(), Some([NoData, MyType::SomeData{x: 3, y: 4}]));
assert_eq!(iter.next(), Some([MyType::SomeData{x: 3, y: 4}, MyType::SomeData{x: 5, y: 6}]));
assert_eq!(iter.next(), Some([MyType::SomeData{x: 5, y: 6}, NoData]));
贡献
这个包还不支持 完全 任意类型。NGram 必须由 Copy
类型组成。欢迎提供关于如何以惯用方式为任意 Clone
类型实现此功能的建议和/或实现。
错误
未知。请报告您遇到的问题。
关于不安全代码的使用
这个库使用了 Rust 语言的 和不稳定 元素。如果您不习惯使用不安全代码,请寻找替代实现,或贡献一个仅在非默认功能背后存在的安全实现。如果您无法使用不稳定功能,请耐心等待这些功能稳定,推荐一种在稳定 Rust 中实现相关代码的方法而不会影响性能(或贡献一个影响性能的实现,但位于非默认功能标志之后),或寻找替代实现。
作者
- D. Scott Boggs:创建者和维护者
许可
这个库是 LGPLv3。