2015-03-31 76 views
0

我是Rust的新手。我如何強制將一個值從內部範圍移到外部而不是借用?如何強制將值從內部範圍移到外部而不是借用?

let mut r_buf = BufReader::new(file.unwrap()); 
let mut eof = false; 

while !eof { 
    let piece = r_buf.fill_buf(); 
    if piece.is_ok() { 
     let mut piece = piece.unwrap(); 
     let piece_len = piece.len(); 

     if opt.compress { 
      let deflated = deflate_bytes(piece); 
      if deflated.is_none() { 
       panic!(format!("Cant deflate file {}", path.to_str().unwrap_or(""))); 
      } 

      let deflate_unwrapped = deflated.unwrap(); 
      let deflate_deref = deflate_unwrapped.deref(); 
      piece = deflate_deref; 
     } 
     /* bf: &mut BufStream<File>*/ 
     let w = bf.write(piece); 

     if w.is_ok() { 
      written_bytes = w.unwrap(); 
     } 

我無法從deflate_deref移動&[u8]piece。我試過Vec<u8>Box<&[u8]>。我有一個錯誤「deflate_unwrapped壽命不夠長」...我無法操作[u8]類型,因爲它沒有編譯類型的確切大小,而引用我只能借用...

In這種情況下,我必須使用特定的東西或重寫此代碼?

遊樂場鏈接http://is.gd/u8wfm7

+0

歡迎來到Stack Overflow!由於我們無法編譯您的代碼以獲得相同的錯誤,因此它將非常難以幫助您!請閱讀有關創建[MCVE](http://stackoverflow.com/help/mcve)的信息。在這種情況下,它需要產生你所看到的同樣的錯誤。理想情況下,你可以在[playpen](https://play.rust-lang.org/)上使用某些東西,但如果使用外部包裝箱,這可能很困難。只要儘可能使問題成爲**小**! – Shepmaster 2015-03-31 21:15:28

+0

感謝您的回覆,請將鏈接添加到play.rust-lang.org。我認爲這是更理論上的問題 – Vitaliy 2015-03-31 21:38:13

+0

'foo.deref()'通常寫得更好'&* foo'。你也經常不需要'&*',例如方法調用做autoderef和autoref。 – 2015-04-01 00:58:31

回答

6

讓你的代碼減少到一個真正的小例子:

fn main() { 
    let a = { 
     let b = 42; 
     &b 
    }; 
} 

因爲這纔是你的情況是熬煮至:試圖採取一些參考,並存儲該參考原始對象超出範圍之後。

有處理這個問題主要有兩種方式:

  1. 變化,你正在服用一個參考變量的範圍:

    fn main() { 
        let b; 
        let a = { 
         b = 42; 
         &b 
        }; 
    } 
    

    只要你不處理交叉函數邊界(即返回函數內部的某個引用)或某些與循環邊界的組合,這通常是最好的解決方案。

  2. 別拿參考,而是你希望在時間與它做什麼樣的處理:

    fn main() { 
        let a = { 
         let b = 42; 
         b.clone() 
        }; 
    } 
    

    在您的特定情況下,可以轉動&[u8]Vec<u8>,這可以寫成Vec::from(slice)。當然,在你的具體例子中,你仍然需要擔心在第一種方式中存儲矢量,或者使用Cow<[u8]>作爲整個事情。

有我寫這尤其考慮這些問題,你可能會發現有用的文章:http://chrismorgan.info/blog/rust-fizzbuzz.html。它涉及Stringstr,你在這裏處理更多Vec<u8>/Bytes[u8],但概念非常相似。

+0

謝謝。你的文章是非常有用的。 – Vitaliy 2015-04-01 10:05:46

相關問題