Como você implementaria uma lista vinculada bidirecional no Rust?

Observe que esta pergunta se refere a uma versão do Rust antes do Rust 1.0. Embora a sintaxe tenha mudado, os conceitos ainda são válidos.

Você pode implementar facilmente uma lista vinculada encaminhada apenas usando ponteiros próprios, algo como:

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

Imagine, no entanto, se você deseja implementar eficientemente uma fila que suporte quatro operações básicas:

push: adicionar ao final da listapop: remova e retorne do final da listaunshift: adicionar à frente da listashift: remova e retorne do final da lista

Em um idioma com ponteiros normais, você pode implementar isso com uma lista vinculada bidirecional e um objeto raiz que armazenafirst elast ponteiros para o primeiro e o último elementos da lista.

Não vejo como você implementaria isso no Rust.

Posso adivinhar vagamente que você usaria um monte de referências e talvez algo como:

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

... mas não consigo ver como você gerenciaria o escopo de vida útil dessas variáveis.

Alguém pode me apontar na direção disso, ou um exemplo semelhante que envolve vidas complexas com referências entre objetos?

(Outro exemplo típico desse estilo de código seria o padrão observador em que muitos objetos devem publicar atualizações de eventos em um único local, por exemplo.UINode <> ----EventObserver <> ----EventCore <> ----UINodes; vários objetos em uma hierarquia complexa que compartilham ponteiros, em que os eventos se propagam dos nós das folhas até algum núcleo e depois são enviados para os diferentes nós das folhas

questionAnswers(3)

yourAnswerToTheQuestion