Kann keine veränderbare Referenz erhalten, wenn eine rekursive Struktur iteriert wird: Kann nicht mehr als einmal gleichzeitig als veränderbar ausleihen

10

Ich versuche, eine rekursive Datenstruktur iterativ zu navigieren, um Elemente an einer bestimmten Position einzufügen. Zu meinem begrenzten Verständnis bedeutet dies, einen veränderlichen Bezug auf die Wurzel der Struktur zu nehmen und sie sukzessive durch einen Verweis auf ihren Nachfolger zu ersetzen:

%Vor%

(Rust Spielplatz Link)

Dies schlägt jedoch fehl:

%Vor%

Dies ist sinnvoll, da sich sowohl anchor als auch node auf die gleiche Struktur beziehen, aber nach der Destrukturierung ist mir anchor eigentlich egal.

Wie konnte back() korrekt mit Safe Rust implementiert werden?

    
Fabian Knorr 23.06.2016, 08:50
quelle

3 Antworten

13

Es ist möglich ... aber ich wünschte, ich hätte eine elegantere Lösung.

Der Trick besteht NICHT darin, von anchor zu borgen und daher zwischen zwei Akkumulatoren zu jonglieren:

  • eine, die den Verweis auf den aktuellen Knoten
  • enthält
  • dem anderen wird der Verweis auf den nächsten Knoten zugewiesen

Das führt mich zu:

%Vor%

Nicht gerade hübsch, aber dieses Etwas, das der Border-Checker hinter sich bringen kann, ist ¯ \ _ (ツ) _ / ¯.

@ker hat dies verbessert, indem ein unbenanntes temporäres erstellt wurde:

%Vor%

Der Trick besteht darin, dass {anchor} den Inhalt von anchor in ein unbenanntes temporäres Objekt verschiebt, auf dem die Übereinstimmung ausgeführt wird. Daher werden wir im match -Block nicht von anchor , sondern vom temporären Programm ausleihen und uns erlauben, anchor zu modifizieren. Siehe den zugehörigen Blogbeitrag Stuff the Identity Function Does (in Rust ) .

    
Matthieu M. 23.06.2016, 09:12
quelle
6

Sie können Rekursion verwenden, um den Border-Checker zu erfüllen. Dies hat den Nachteil, dass für jeden Eintrag in Ihrer Liste ein Stapelrahmen erstellt wird. Wenn Ihre Liste lang ist, wird dies definitiv zu einem Stapelüberlauf führen. LLVM optimiert die Methode Node::back in eine Schleife (siehe die LLVM IR, die auf der Seite generiert wurde Spielplatz )

%Vor%     
oli_obk - ker 23.06.2016 09:10
quelle
1

Es funktioniert:

%Vor%     
aSpex 23.06.2016 09:47
quelle

Tags und Links