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%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?
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:
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 ) .
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 )