2014-08-30 63 views
4

了,我實現了一個簡單的鏈表正是如此無法移動的&MUT指針

struct List { 

    data : String, 
    cons : Option<Box<List>> 
} 

我已經定義的其他結構具有這種類型的成員,下面

pub struct Context { 

    head : Option<Box<List>> 
} 

在結構這個結構體的函數運行,我有這個代碼

let mut temp_head = &mut self.head; 
let mut full_msg = "".to_string(); 
while temp_head.is_some() { 
     let temp_node = temp_head.unwrap(); 
     full_msg.push_str(temp_node.data.as_slice()); 
     temp_head = temp_node.cons; 
} 

要遍歷鏈表並組裝一串他們的數據。但是,設置temp_node值的行會產生以下錯誤:cannot move out of dereference of &mut-pointer,並且編譯器也會抱怨,我試圖放入temp_head的值不會超過該塊。

我試過克隆第一行的temp_head或最後一行的temp_node.cons來獲取我想要的生命週期的版本,但這只是產生了額外的錯誤,而真正的問題似乎是我只是不願意不明白爲什麼第一個版本不起作用。有人可以解釋我做錯了什麼,並且/或者將我鏈接到可以解釋這個問題的Rust文檔?

回答

4

您需要對代碼中的引用非常小心,問題在於,首先您確實嘗試使用unwrap()temp_head的內容移出其容器。被移動的內容將在while區塊末尾被銷燬,而temp_head則會引用已刪除的內容。

您需要使用引用的所有道路,這種模式的匹配比使用unwrap()is_some(),這樣比較合適:

let mut temp_head = &self.head; 
let mut full_msg = "".to_string(); 
while match temp_head { 
    &Some(ref temp_node) => { // get a reference to the content of node 
     full_msg.push_str(temp_node.data.as_slice()); // copy string content 
     temp_head = &temp_node.cons; // update reference 
     true // continue looping 
    }, 
    &None => false // we reached the end, stop looping 
} { /* body of while, nothing to do */ }