Rust 访问由Take或Chain包装的Read的组件

Rust 访问由Take或Chain包装的Read的组件,rust,Rust,我正在编写GoogleBrotli解压算法的Rust实现,它在流的末尾使用固定数量的“隐式零”来实现某些优化 GoogleC实现使用各种计数器的意大利面代码来实现这一点,但是我想使用Rust std::io库中的适配器。比如: pub struct StreamBitReader<R> { reader: Chain<R,Take<Repeat>>, ... } pub结构StreamBitReader{ 读者:链, ... } 其中,“R

我正在编写GoogleBrotli解压算法的Rust实现,它在流的末尾使用固定数量的“隐式零”来实现某些优化

GoogleC实现使用各种计数器的意大利面代码来实现这一点,但是我想使用Rust std::io库中的适配器。比如:

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
方法返回对包装对象的引用