没有方法' entries_mut'使用tar crate解压缩文件时?

时间:2015-11-24 14:54:46

标签: rust

我正在尝试使用flate2tar包来迭代.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}} }。

显然我在这里遗漏了一些东西,有人可以帮忙解释一下吗?

2 个答案:

答案 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 doccargo doc --open。这将为您正在使用的包装箱和版本构建一套文档。

答案 1 :(得分:0)

原来,tar-rs的已发布文档的版本与crates.io上的版本不同,因此我必须将.entries_mut更改为.files_mut和{{ 1}}到let files =