rust - 如何将 Rust ZipArchive 和 ZipFile 放入单个 Read-implementing 结构中,同时处理生命周期和借用规则
问题描述
这个问题可以用几种不同的方式提出,但我的最终目标是将一个文件从ZipArchive
(Rust zip crate)封装到一个名为ZipReader
实现 Read 的结构中,如下所示:
struct ZipReader<R: Read + Seek> { ... }
impl<R: Read + Seek> ZipReader<R> {
fn from(src: R, filename: &str) -> ZipReader<R> { ... }
}
impl <R: Read + Seek> Read for ZipReader<R> { ... }
我这样做的努力涉及ZipArchive
从 src 流构造一个新的,然后使用它ZipArchive.by_name(name)
来提取ZipFile<'a>
可以从中读取的字节。
我遇到的问题是该ZipFile<'a>
结构引用了&'a mut ZipArchive
构造它的生命周期——这意味着ZipArchive
必须保持在范围内,并且在ZipFile
.
这种约束组合似乎无法将 zip 封装在新结构中:
pub struct ZipReader<R: Read + Seek> {
file: zip::read::ZipFile<'_>, // Have experimented with lifetimes here with no success
archive: ZipArchive<R>,
}
impl <R: Read + Seek> ZipReader<R> {
fn from(mut zip: R, name: &str) -> ZipReader<R> {
let archive = ZipArchive::new(zip);
let file = archive.by_name(name).unwrap();
ZipReader {
file: file,
archive: archive.unwrap(),
}
}
}
impl <R: Read + Seek> Read for ZipReader<R> {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
self.file.read(buf)
}
}
我不能file
单独移动到返回的ZipReader
,因为archive
会超出范围,但我不能移动archive
到,ZipReader
因为它是借用的file
。
似乎修改 zip crate 并将ZipFile
状态合并ZipArchive
到其中以消除生命周期问题将是解决问题的一种方法。在不修改其他人的代码的情况下如何解决这个问题?
解决方案
正如 Coder-256 所提到的,owning_ref::OwningHandle
它提供了解决借用问题的功能,但不是生命周期问题。回购中有一个未解决owning_ref
的问题,它描述了一种等效情况并要求提供额外的功能来解决它,但它自 2017 年以来一直处于开放状态,但没有解决方案。
我最终修改了 zip crate以转移底层流的所有权,而不是持有对 ZipArchive 的引用。这对我的目的来说已经足够令人满意了,但是像这样的解决方案owning_ref
似乎是解决此类问题的正确方法。
推荐阅读
- django - binascii.hexlify(os.urandom(32)).decode() 是什么意思?
- wordpress - 如何将自定义字段添加到我的页眉
- typescript - 打字稿扩展第三方类错误:ElementHandle 仅引用类型,但在此处用作值
- flask - kubernetes 入口 websockets (socket.io)
- python - Python,检查电子邮件是否存在
- python - Matplotlib 在绘图内添加网格线
- excel - 如何只需按一下按钮即可将多个不同的单元格复制到另一个工作表
- c++ - C ++无法打印已经创建并从文本文件中读取的整个列表
- django - 如何从 HTML 标签传递值(除了tag ) 来查看使用窗体?
- javascript - 通过 Object.assign 设置 CSS 自定义属性