Как бы вы внедрили двунаправленный связанный список в Rust?

Обратите внимание, что этот вопрос относится к версии Rust до Rust 1.0. Хотя синтаксис изменился, концепции все еще действительны.

Вы можете легко реализовать связанный список только для пересылки, используя собственные указатели, например:

struct Node<T> {
  next: Option<~Node<T>>,
  data: T
}

Представьте себе, однако, если вы хотите эффективно реализовать очередь, которая поддерживает четыре основных операции:

push: добавить в конец спискаpop: удалить и вернуться из конца спискаunshift: добавить в начало спискаshift: удалить и вернуться из конца списка

На языке с обычными указателями вы можете реализовать это с помощью двунаправленного связанного списка и корневого объекта, который хранитfirst а такжеlast указатели на первый и последний элементы в списке.

Я не понимаю, как бы вы реализовали это в Rust.

Я могу смутно предположить, что вы использовали бы кучу ссылок, и, возможно, что-то вроде:

struct Node<T> {
  next: Option<&Node<T>>,
  prev: Option<&Node<T>>,
  data: T
}

... но я не могу понять, как вы управляете жизненным объемом этих переменных.

Кто-нибудь может указать мне направление этого или подобный пример, который включает сложные времена жизни со ссылками между объектами?

(Другим типичным примером этого стиля кода может быть шаблон наблюдателя, где многие объекты должны публиковать обновления событий в одном месте, например.UINode <> ----EventObserver <> ----EventCore <> ----UINodes; несколько объектов в сложной иерархии с общими указателями, где события распространяются от конечных узлов до некоторого ядра, а затем выталкиваются на разные конечные узлы)

Ответы на вопрос(3)

Ваш ответ на вопрос