Ich habe eine zwei Elemente Vector
Struktur und ich möchte den +
Operator überladen.Wie implementiere ich das Add-Merkmal für eine Referenz auf eine Struktur?
Ich machte alle meine Funktionen und Methoden nehmen Referenzen, anstatt Werte, und ich möchte die +
-Operator auf die gleiche Weise arbeiten.
Je nachdem, welche Variante ich versuche, bekomme ich entweder Lebensdauerprobleme oder Typenkonflikte. Insbesondere scheint das &self
Argument nicht als der richtige Typ behandelt zu werden.
Ich habe Beispiele mit Vorlagenargumenten auf impl
sowie Add
gesehen, aber sie führen nur zu unterschiedlichen Fehlern.
Ich fand How can an operator be overloaded for different RHS types and return values? aber der Code in der Antwort funktioniert nicht, auch wenn ich einen use std::ops::Mul;
an der Spitze setzen.
Ich verwende rustc 1.0.0-nächtliche (ed530d7a3 2015-01-16 22:41:16 +0000)
Ich werde nicht akzeptieren „Sie nur zwei Felder haben, warum eine Referenz verwenden“, wie eine Antwort; Was, wenn ich eine Struktur mit 100 Elementen wollte? Ich werde eine Antwort akzeptieren, die zeigt, dass selbst bei einer großen Struktur der Wert überschritten werden sollte, wenn das der Fall ist (ich glaube jedoch nicht.) Ich bin daran interessiert, eine gute Faustregel für die Strukturgröße zu kennen und Übergabe an Wert gegen Struktur, aber das ist nicht die aktuelle Frage.
"Was ist, wenn ich eine Struktur mit 100 Elementen wollte" - Rust verwendet Optimierungen wie RVO, die automatisch eine Referenz verwenden, wenn es angebracht ist und die bessere Wahl. – Shepmaster
@Shempmaster: RVO wirkt sich nur auf den Rückgabewert aus, den ich als Wert zurückgebe. Können Sie auf eine Dokumentation verweisen, die zeigt, dass Merkmale für große Strukturen wertmäßig implementiert werden sollten? –
Die beste Dokumentation, die ich kenne, wäre das [Buch Kapitel über zurückkehrende Zeiger] (http://doc.rust-lang.org/book/pointers.html#returning-pointers). Allerdings habe ich [ein Beispiel für das Hinzufügen einer großen Struktur erstellt] (http://is.gd/25ITa7) und überprüft die generierte LLVM (leicht gereinigt): '(% struct.Big * sret,% struct.Big *,% struct.Big *) '. Ich behaupte nicht, ein LLVM-Experte zu sein, aber das sieht so aus, als würde es automatisch als Referenz genommen und zurückgegeben. – Shepmaster