"kann sich nicht aus dem ausgeliehenen Inhalt herausbewegen", wenn der Operator überlastet wird

8

Ich erhalte einen Kompilierungsfehler von einer einfachen Hilfsmethode, wenn ich eine Klasse mit Operatorüberladung verwende. Hier ist ein in sich geschlossener Test (vereinfacht von meinem echten Code, aber demonstriert immer noch das Problem):

%Vor%

Ich versuche, dies mit Rust 1.8 zu kompilieren, aber ich bekomme diesen Fehler:

%Vor%

Ich habe das Rust Book und die Teile über das Eigentum und die Kreditaufnahme gelesen. Ich habe hier zahlreiche Fragen zu dieser Frage in StackOverflow gelesen, z. B .:

Kann ausgeliehenen Inhalt nicht entfernen

Ich glaube nicht, dass meine Frage ein Duplikat ist, denn während der Fehler derselbe ist, sind die Umstände anders. Auch wenn ich wüsste, wie sich diese anderen Fragen auf diesen beziehen, müsste ich nicht fragen. : -)

Meine Frage ist also: Wie kann ich diesen Fehler beheben? Ich möchte &self nicht in self ändern, weil das andere Probleme verursacht.

Abgesehen davon, dass ich nur das Problem gelöst habe, möchte ich auch wissen, wovor Rust Angst hat. Ich sehe hier keine Gefahren.

    
Paul A Jungwirth 19.05.2016, 03:13
quelle

1 Antwort

8

Sie implementieren die Operatoren für Money und nicht für &Money . Dies bedeutet, dass der Operator Eigentümer seiner Operanden übernimmt. In total müßten Sie deshalb% ce_de% verschieben, was nicht erlaubt ist, weil Sie nicht aus einem ausgeliehenen Zeiger herauskommen können (Sie können nur Werte verschieben, die Sie besitzen). Rust kopiert -Werte, wenn ihr Typ self.absolute (was bei Primitiven wie Copy oder i32 der Fall ist); Andernfalls wird verschoben , was bedeutet, dass die Quelle nach dem Verschieben unbrauchbar wird.

Wenn Ihr f64 struct wirklich nur ein Money -Feld enthält, empfehle ich, dass Sie cents implementieren (was ebenfalls die Implementierung von Copy , was auch dann sinnvoll wäre, wenn Sie Clone nicht implementieren. Sie können Copy und Copy einfach mit Clone :

implementieren %Vor%

Jetzt, in #[derive] , wird Rust anstelle von total stattdessen kopieren. Wenn Sie self.absolute nicht implementieren können, ersetzen Sie Copy durch self.absolute .

Wenn Sie die Operatoren für self.absolute.clone() implementiert hätten, könnten Sie einfach Verweise an Ihre &Money -Werte übergeben. Mit solchen Implementierungen könnte beispielsweise Money wie folgt implementiert werden:

%Vor%     
Francis Gagné 19.05.2016, 03:20
quelle

Tags und Links