2016-01-25 127 views
1

我有以下代碼:我怎樣才能複製串或STR

let mut dirs = vec![String::from(".")]; 
// This one doesn't work too: 
//let mut dirs = vec!["."]; 

while dirs.len() > 0 { 
    let paths = fs::read_dir(dirs.pop().unwrap()).unwrap(); 
    for path in paths {    
     if path.unwrap().metadata().unwrap().is_dir() { 
      dirs.push(String::from(path.unwrap().path().to_str().unwrap()).clone()) 
      // This one doesn't work too: 
      //dirs.push(path.unwrap().path().to_str().unwrap()) 
     } 
    } 
} 

它總是給人一種編譯錯誤:use of moved value: 'path' [E0382]

我試過不同的方法,仍然不明白我怎樣才能複製一個字符串path.to_str()因此它可以存活比path更長的變量。看起來像Stringstr不支持Copy特質。 所以主要的問題是如何使上面的代碼工作?

我需要以某種方式製作一個字符串的副本。在C中,我將使用memcpystrcpy來執行該任務。 Rust中有沒有類似的功能?

+0

你似乎已經解決了這個問題,以瞭解在借來的' &str'到你自己的'String'對象。 'String :: from'工作得很好 –

回答

1

致電unwrap()將移動您的path對象。最簡單的方法是在循環的開頭說

let path = path.unwrap(); 

,然後用展開的路徑對象的工作,一旦移動它:

let mut dirs = vec![String::from(".")]; 

while dirs.len() > 0 { 
    let paths = fs::read_dir(dirs.pop().unwrap()).unwrap(); 
    for path in paths { 
     let path = path.unwrap(); 
     if path.metadata().unwrap().is_dir() { 
      dirs.push(String::from(path.path().to_str().unwrap())) 
     } 
    } 
} 
+0

Ker,是的,它的工作原理! – Dmitry