2015-04-01 28 views
1

我有一個結構如何在移動時自動清除結構中的屬性?

struct Test { 
    list: Vec<u64> 
} 

和方法,其中我想獲得矢量和擦除列表字段爲空VEC

fn get_list(&self) -> Vec<u64> { 
    let list = Vec::new(); 
    for item in self.list.drain() { 
     list.push(item); 
    } 
    list 
} 

它有沒有做它的另一種方法?像autoreinit場的移動值,例如:

fn get_list(&self) -> ???<Vec<u64>> { 
    self.list 
} 
+2

兩個'get_list'示例都需要''mut''採用'self',否則您不能修改'list'字段 – 2015-04-01 12:29:54

回答

2

這裏是解決方案,你可以在操場鏽病測試(可惜份額按鈕不適用於我atm)。

use std::mem; 

#[derive(Debug)] 
struct Test { 
    list: Vec<u64> 
} 

impl Test { 

    fn get_list(&mut self) -> Vec<u64> { 
     let repl = mem::replace(&mut self.list, Vec::new()); 
     repl 
    } 

} 

fn main() { 
    let mut r = Test { 
     list : vec![1,2,3] 
    }; 
    print!("r : {:?} ", r); 
    print!("replace : {:?} ", r.get_list()); 
    print!("r : {:?} ", r); 
} 

你只需要一個可變值運行mem::replacedocs),並與將在其位置移動的值來代替它。在這種情況下,我們的目的地是self.list,我們正在替換它的值爲空白Vec。要採取

  • 現場測試的self.list,需要爲&mut self.list

    需要注意的事項。

  • 上一個更改意味着self也應該是可變的。
  • 替換的第二個參數被移動。這意味着在此通話後它將不能繼續使用。這通常意味着,您可以將其傳遞給Vec構造函數(例如Vec::new())或替換值的克隆。