Kann 'x' nicht mehrmals als veränderbar ausleihen

8

Im folgenden Code ( Spielplatz ):

%Vor%

Ich habe diese Art von Fehler:

%Vor%

Meine Frage scheint Warum will Rust eine Variable mehrmals als veränderlich ausleihen? , aber ich bin mir nicht sicher. Wenn ja, gibt es einen Workaround für diesen Fall?

    
tower120 07.07.2015, 23:32
quelle

2 Antworten

13

Dies geschieht aufgrund dessen, wie add definiert ist:

%Vor%

Hier ist festgelegt, dass die Lebensdauer der resultierenden Referenz gleich der Lebensdauer der eingehenden Referenz sein soll. Die einzige Möglichkeit (außer für unsicheren Code) besteht darin, dass die resultierende Referenz irgendwie von der eingehenden Referenz abgeleitet wird, z. B. verweist sie auf ein Feld innerhalb des Objekts, auf das die eingehenden Referenzpunkte zeigen:

%Vor%

Es gibt jedoch no , damit der Compiler weiß, was genau von der eingehenden Struktur entliehen ist, indem er nur die Funktionssignatur betrachtet (was im Allgemeinen der Fall ist) das einzige, was es tun kann, wenn Code kompiliert wird, der diese Funktion verwendet). Daher kann es nicht wissen, dass der folgende Code technisch korrekt ist:

%Vor%

Wir wissen, dass a und b nicht zusammenhängen, weil sie auf verschiedene Teile der Struktur zeigen, aber der Compiler kann das nicht wissen, weil es in borrow_a signature nichts gibt würde es vorschlagen (und es kann nicht sein, Rust unterstützt es nicht).

Daher ist es das einzig Vernünftige, was der Compiler tun kann, das gesamte x zu berücksichtigen, das ausgeliehen werden soll, bis der von borrow_a() zurückgegebene Verweis gelöscht wird. Andernfalls wäre es möglich, zwei veränderbare Referenzen für die gleichen Daten zu erstellen, was eine Verletzung der Aliasing-Garantien von Rust darstellt.

Beachten Sie, dass der folgende Code korrekt ist:

%Vor%

Hier kann der Compiler sehen, dass a und b niemals auf die gleichen Daten zeigen, obwohl sie innerhalb der gleichen Struktur zeigen.

Es gibt also keine Problemumgehung dafür, und die einzige Lösung wäre, den Code so umzustrukturieren, dass er keine solchen Ausleihmuster hat.

    
Vladimir Matveev 08.07.2015, 05:20
quelle
2

Das Verhalten ist logisch. Überlege was

%Vor%

bedeutet.

Dies besagt, dass &mut Node eine Lebensdauer von gleich zur Lebensdauer seines Rückgabewerts hat. Da Sie den Rückgabewert einem Namen zuweisen, bleibt er bis zum Ende des Bereichs bestehen. Daher lebt auch der veränderbare Kredit so lange.

Wenn Sie den Rückgabewert einfach verwerfen können, tun Sie dies. Sie können es einfach auf den Boden fallen lassen:

%Vor%

oder Sie können einen lexikalischen Bereich verwenden, um ihn einzuschränken, ohne ihn vollständig zu löschen.

Wenn Sie die Rückgabe ohne ausleihen wollen, müssen Sie die Funktion auch in zwei Teile aufteilen. Dies liegt daran, dass Sie nicht in der Lage sind, den Rückgabewert aus dem veränderbaren Kredit zu leihen.

    
Veedrac 08.07.2015 03:02
quelle

Tags und Links