Обратите внимание, что этот вопрос относится к версии 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
; несколько объектов в указателях с объединением сложной иерархии, где события распространяются от листовых узлов до некоторого ядра, а затем выталкиваются в разные узлы листа)