2015-11-24 31 views
2

我正在嘗試使用flate2tar箱來遍歷.tar.gz文件的條目,但是出現類型錯誤,我不知道爲什麼。用tar格式解壓文件時沒有方法'entries_mut'?

這裏是我的代碼(是的,我知道我不應該使用.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>,其中只要R實現Read實現Read,這File呢,所以這應該是罰款。 Archive<O>有不同的方法取決於什麼種類O實現,但在這種情況下,我試圖使用.entries_mut(),這隻需要O實施Read

顯然我在這裏失去了一些東西,有人可以幫助闡明這一點嗎?

回答

0

事實證明的tar-rs公佈的文件是一個不同的版本比什麼是對crates.io,所以我不得不改變.entries_mut.files_mut,並let files =let mut files =

3

哦,男人,這是棘手的。已發佈的文檔和代碼不匹配。在焦油版本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文檔(我自己的箱子有同樣的問題)。我們在主分支分支上建立文檔,但人們使用穩定版本。有時這些不同步。

您可以做的最好的事情是在您的本地項目上運行cargo doccargo doc --open。這將爲您正在使用的包裝箱和版本建立一套文檔。