#ngrams #iterator #copy #type #str #word #options

nightly ngram_iter

任意 Rust Copy 类型的 N-gram 迭代器

1 个不稳定版本

0.1.0 2022 年 6 月 29 日

2581Rust 模式

每月 30 次下载
ragegun 中使用

LGPL-3.0

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 中实现相关代码的方法而不会影响性能(或贡献一个影响性能的实现,但位于非默认功能标志之后),或寻找替代实现。

作者

许可

这个库是 LGPLv3。

无运行时依赖