Rust 访问由Take或Chain包装的Read的组件
我正在编写GoogleBrotli解压算法的Rust实现,它在流的末尾使用固定数量的“隐式零”来实现某些优化 GoogleC实现使用各种计数器的意大利面代码来实现这一点,但是我想使用Rust std::io库中的适配器。比如:Rust 访问由Take或Chain包装的Read的组件,rust,Rust,我正在编写GoogleBrotli解压算法的Rust实现,它在流的末尾使用固定数量的“隐式零”来实现某些优化 GoogleC实现使用各种计数器的意大利面代码来实现这一点,但是我想使用Rust std::io库中的适配器。比如: pub struct StreamBitReader<R> { reader: Chain<R,Take<Repeat>>, ... } pub结构StreamBitReader{ 读者:链, ... } 其中,“R
pub struct StreamBitReader<R> {
reader: Chain<R,Take<Repeat>>,
...
}
pub结构StreamBitReader{
读者:链,
...
}
其中,“R”是位读取器结构正在包装的基础读取
。然而,在许多情况下,解压算法会检查流是否“溢出”,并通过检查隐式读取的零字节数来实现这一点。这在安全防锈中似乎是不可能的,因为除非我遗漏了什么,否则无法获得对链的组件的引用
当构建链
时,它获取(移动)底层Read
结构的所有权,然后这些结构隐藏在私有成员中
有没有办法构造Take
部分,这样我就可以访问Take
的limit()
fn,即使在链
适配器拥有所有权之后?我知道一种方法,但我认为它不适合您的目标
use std::io::{self, Read};
fn main() {
let file = io::empty();
let zeroes = io::repeat(0);
let mut ten_zeroes = zeroes.take(10);
{
let mut with_zeroes = file.chain(ten_zeroes.by_ref());
let mut buf = [0; 5];
with_zeroes.read(&mut buf);
}
println!("{}", ten_zeroes.limit());
}
键为,它返回一个可变引用Read
是为实现Read
的类型的任何可变引用而实现的,因此您可以为链的引用赋予所有权
诀窍是,在再次使用内部对象之前,必须先销毁链。将其存储在结构中也是非常痛苦/不可能的
您最好编写自己的zeroppadded
适配器,该适配器结合了链
、重复
、和获取
,并提供了限制
方法
如果没有其他人给出更好的答案,我还可以看到在适配器上添加对方法的特性请求。使用into\u-inner
方法使用适配器并返回包装的项目并不少见,但也可以使用as\u-inner
方法返回对包装对象的引用