2014-01-16 36 views
4

我想我會通過實現一些非常簡單的結構&算法來深入Rust,我從一個鏈表開始。結果並不是那麼簡單。這是到目前爲止我的代碼:生鏽:如何實現鏈表?

enum List<T> 
{ 
    Node(T, ~List<T>), 
    Nil 
} 

impl<T> List<T> 
{ 
    fn new(vector: &[T]) -> List<T> { Nil } 

    fn add(&mut self, item: T) 
    { 
     let tail = self; 
     loop 
     { 
      match *tail 
      { 
       Node(_, ~ref next) => tail = next, 
       Nil => break 
      } 
     } 
     *tail = Node(item, ~Nil); 
    } 
} 

這不能編譯,因爲未來不能被分配給在比賽中陳述尾由於不兼容的可變性。我知道這可以很容易地使用垃圾收集指針來完成,但是這樣做會挫傷練習的教育目的:我想知道如何在沒有Gc或Rc指針的情況下執行此操作。

回答

5

它看起來像你試圖走自己的列表來找到最終的元素,但你實際上沒有一個循環。假設你解決了這個問題,你可以通過使用ref mut而不是ref來解決你的問題。

自己試試吧我用遞歸實現的add()和這個作品:

fn add(&mut self, item: T) { 
    match *self { 
     Node(_, ref mut next) => next.add(item), 
     Nil => *self = Node(item, ~Nil) 
    } 
} 

隨口說說我不知道​​如何實現這種使用迭代的方法,由於與可變借貸的問題。

+0

謝謝!是的,有一個循環,但我之間來回循環和遞歸方法之間來回,我猜在一些點我失去了它。將編輯。 – kralyk