2015-12-30 52 views
1

當下面的代碼:「使用移動價值」試圖使用相同的資源兩次

extern crate tempdir; 

use std::env; 
use tempdir::*; 

#[test] 
fn it_installs_component() { 
    let current_dir = env::current_dir().unwrap(); 
    let home_dir = env::home_dir().unwrap(); 
    let tmp_dir = env::temp_dir(); 

    println!("The current directory is: {}", current_dir.display()); 
    println!("The home directory is: {}", home_dir.display()); 
    println!("The temporary directory is: {}", tmp_dir.display()); 

    let stage_dir = TempDir::new_in(tmp_dir.as_path(), "Components-Test"); 

    let components_dir = TempDir::new_in(stage_dir.unwrap().path(), "Components"); 

    // This is "offending line" 
    // let components_make_dir = TempDir::new_in(stage_dir.unwrap().path(), "Components.make"); 

    println!("---- {:?}", components_dir.unwrap().path()); 
    //println!("---- {:?}", components_make_dir.unwrap().path()); 
} 

如果違規行註釋掉的代碼編譯罰款。如果我取消它,我就得到一個錯誤:

error[E0382]: use of moved value: `stage_dir` 
    --> src/main.rs:21:51 
    | 
18 |   let components_dir = TempDir::new_in(stage_dir.unwrap().path(), "Components"); 
    |            --------- value moved here 
... 
21 |   let components_make_dir = TempDir::new_in(stage_dir.unwrap().path(), "Components.make"); 
    |             ^^^^^^^^^ value used here after move 
    | 
    = note: move occurs because `stage_dir` has type `std::result::Result<tempdir::TempDir, std::io::Error>`, which does not implement the `Copy` trait 

我理解的問題是,我謹stage_dir當我使用它的第一次,但我看不出那兩個子之間共享stage_dir因爲我需要在我的測試中訪問它們。

我試着玩&stage_dir,但是這產生了一些其他的警告對我來說更加晦澀難懂。

回答

5

TempDir::new讓你回到Result<TempDir>。您試圖每次打開包裝,而不是打開包裝,以獲得TempDir,然後共享

因此改變

let stage_dir = TempDir::new_in(tmp_dir.as_path(), "Components-Test"); 

let stage_dir = TempDir::new_in(tmp_dir.as_path(), "Components-Test").unwrap(); 

代替。

+0

感謝您的及時答覆,現在它工作!我仍然不明白爲什麼不能分享項目,反之亦然 - 有沒有鏈接到某個地方或簡單的解釋? –

+2

我的意思是,你也可以分享它,但你不是。你試圖拆開它兩次。 –

相關問題