Wie würden Sie eine bidirektionale verknüpfte Liste in Rust implementieren?

Beachten Sie, dass sich diese Frage auf eine Version von Rust before Rust 1.0 bezieht. Obwohl sich die Syntax geändert hat, sind die Konzepte weiterhin gültig.

Sie können einfach eine nur für die Weiterleitung verknüpfte Liste mit eigenen Zeigern implementieren, etwa:

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

Stellen Sie sich jedoch vor, Sie möchten eine Warteschlange effizient implementieren, die vier grundlegende Operationen unterstützt:

push: Zum Ende der Liste hinzufügenpop: entferne und kehre vom Ende der Liste zurückunshift: am Anfang der Liste hinzufügenshift: entfernen und vom Ende der Liste zurückkehren

In einer Sprache mit normalen Zeigern können Sie dies mit einer bidirektionalen verknüpften Liste und einem Stammobjekt implementieren, das gespeichert wirdfirst undlast Zeiger auf das erste und letzte Element in der Liste.

Ich kann nicht sehen, wie Sie dies in Rust umsetzen würden.

Ich kann irgendwie vage vermuten, dass Sie eine Reihe von Referenzen verwenden würden, und vielleicht so etwas wie:

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

... aber ich kann nicht sehen, wie Sie den Gültigkeitsbereich dieser Variablen verwalten würden.

Kann mich jemand darauf hinweisen oder auf ein ähnliches Beispiel, bei dem es um komplexe Lebensdauern mit Bezügen zwischen Objekten geht?

(Ein weiteres typisches Beispiel für diesen Codestil ist das Beobachtermuster, bei dem viele Objekte Ereignisaktualisierungen an einem einzelnen Ort veröffentlichen müssen, z.UINode <> ----EventObserver <> ----EventCore <> ----UINodes; mehrere Objekte in einer komplexen Hierarchie teilen sich Zeiger, bei denen Ereignisse von Blattknoten zu einem Kern übertragen und dann zu verschiedenen Blattknoten verschoben werden.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage