gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:19:14 25 4
gpt4 key购买 nike

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

Google C 实现使用各种计数器的意大利面条代码来执行此操作,但我想改用 Rust std::io 库中的适配器。像这样的东西:

pub struct StreamBitReader<R> {
reader: Chain<R,Take<Repeat>>,
...
}

其中“R”是基础 Read位读取器结构正在包装。然而,在许多情况下,解压缩算法会检查它是否已“溢出”流,并且它通过检查读取的隐式零字节数来做到这一点。这在安全 Rust 中似乎是不可能的,因为没有办法获得对 Chain 组件的引用。 ,除非我遗漏了什么。

Chain构建后,它获得(移动)底层 Read 的所有权结构,然后隐藏在私有(private)成员中。

有什么方法可以构造Take<Repeat>这样我就可以访问 limit() 的部分脚注 Take即使在 Chain 之后适配器取得所有权?

最佳答案

我知道一种方法,但我认为它不适合您的目标。

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::by_ref ,它返回一个可变引用。 Read 是针对任何对实现了 Read 的类型的可变引用而实现的,因此您可以将引用的所有权 授予 Chain.

诀窍是您必须先销毁Chain,然后才能再次使用内部对象。将其存储在结构中也会非常痛苦/不可能。

最好的办法可能是编写自己的 ZeroPadded 适配器,它结合了 ChainRepeatTake并提供了limit方法。

如果没有其他人给出更好的答案,我还可以看到为适配器上的方法添加功能请求。使用适配器并返回包装项的 into_inner 方法并不少见,但您也可以使用 as_inner 返回对包装对象的引用。

关于rust - 访问由 Take 或 Chain 包装的 Read 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33114619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com