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.
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
:
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:
Tags und Links rust