我正在尝试使用flate2和tar包来迭代.tar.gz
文件的条目,但是我遇到类型错误,我不知道为什么
这是我的代码(是的,我知道我不应该在任何地方使用.unwrap()
,这只是POC代码):
extern crate flate2; // version 0.2.11
extern crate tar; // version 0.3
use std::io::Read;
use std::fs::File;
use flate2::read::GzDecoder;
use tar::Archive;
fn main() {
let file = File::open("/path/to/tarball.tar.gz").unwrap();
let mut decompressed = GzDecoder::new(file).unwrap();
let unarchived = Archive::new(decompressed);
let entries_iter = unarchived.entries_mut();
}
这给了我错误error: no method named 'entries_mut' found for type 'tar::Archive<flate2::gz::DecoderReader<std::fs::File>>' in the current scope
。
GzDecoder::new
返回DecoderReader<R>
,只要Read
实现R
Read
,就会File
执行Archive<O>
没事的。 O
具有不同的方法,具体取决于.entries_mut()
实现的特征类型,但在这种情况下,我尝试使用O
,只需要Read
来实现{{1}} }。
显然我在这里遗漏了一些东西,有人可以帮忙解释一下吗?
答案 0 :(得分:3)
哦,伙计,这很棘手。已发布的文档和代码不匹配。在tar版本0.3.2中,该方法称为files_mut
:
extern crate flate2; // version 0.2.11
extern crate tar; // version 0.3
use std::fs::File;
use flate2::read::GzDecoder;
use tar::Archive;
fn main() {
let file = File::open("/path/to/tarball.tar.gz").unwrap();
let decompressed = GzDecoder::new(file).unwrap();
let mut unarchived = Archive::new(decompressed);
let _files_iter = unarchived.files_mut();
}
This commit更改了API。
这是一个微妙但普遍存在的问题,目前自我托管的Rust文档(我自己的crates也有同样的问题)。我们在每次推送 master 分支时都会构建文档,但是人们使用稳定版本。有时这些不同步。
您可以做的最好的事情是在本地项目上运行cargo doc
或cargo doc --open
。这将为您正在使用的包装箱和版本构建一套文档。
答案 1 :(得分:0)
原来,tar-rs
的已发布文档的版本与crates.io
上的版本不同,因此我必须将.entries_mut
更改为.files_mut
和{{ 1}}到let files =
。