5个稳定版本
2.2.0 | 2024年1月26日 |
---|---|
2.1.1 | 2024年1月23日 |
2.1.0 | 2024年1月19日 |
2.0.0 | 2023年11月11日 |
1.2.0 | 2023年9月10日 |
在Rust模式中排名1043
每月下载47次
135KB
4K SLoC
advreader
此库提供了一种简单高效的方式读取输入行作为字节数组。它基本上是标准库中的&[u8]
,但它读取每一行作为字节数组。这在您不特别关心Unicode的情况下会显著快于lines()
,基本上与手动编写循环一样快。尽管代码本身有些简单,但我最近至少在4个工具中都需要这个,所以我认为现在是时候有一个方便的crate了。
安装
此工具将通过Crates.io提供,因此您可以在Cargo.toml
中将它作为依赖项添加。
[dependencies]
advreader = "2.0.0"
用法
它相当简单;在您通常会在BufRead
实现器上调用lines
的地方,您现在可以调用byte_lines
来获取一个用于遍历行的结构,作为&[u8]
(从而避免分配)。有两种使用API的方式,下面都展示了
// our input file we're going to walk over lines of, and our reader
let file = File::open("./my-input.txt").expect("able to open file");
let reader = BufReader::new(file);
let mut lines = reader.byte_lines();
// Option 1: Walk using a `while` loop.
//
// This is the most performant option, as it avoids an allocation by
// simply referencing bytes inside the reading structure. This means
// that there's no copying at all, until the developer chooses to.
while let Some(line) = lines.next() {
// do something with the line
}
// Option 2: Use the `Iterator` trait.
//
// This is more idiomatic, but requires allocating each line into
// an owned `Vec` to avoid potential memory safety issues. Although
// there is an allocation here, the overhead should be negligible
// except in cases where performance is paramount.
for line in lines.into_iter() {
// do something with the line
}
该接口是在advreader
的v2.x版本系列中引入的。在v1.x版本中已经实现了Iterator
特质,但为了过于符合习惯用法,需要使用unsafe
合约。这个问题已经被修复,并移除了所有不安全代码,同时为那些喜欢更简洁语法的开发者提供了IntoIterator
实现。
依赖关系
~3.5–8.5MB
~75K SLoC