2014-01-16 3 views
4

Я думал, что буду погружаться в Rust, внедряя некоторые очень простые структуры алгоритмов &, я начал со связанного списка. Оказывается, это не так просто. Это мой код до сих пор: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

Смежные вопросы