Wann sollte ich kein Merkmal für Verweise auf die Implementierer dieses Merkmals implementieren?

8

Wenn ich ein Merkmal habe und eine Funktion, die einen generischen Typ akzeptiert, der auf diesen Typ beschränkt ist, funktioniert alles. Wenn ich versuche, einen Verweis auf diesen Typ zu übergeben, bekomme ich einen Kompilierungsfehler.

%Vor%

Ich kann das Problem beheben, indem ich das Merkmal für jede Referenz auf einen Typ implementiere, der das Merkmal implementiert:

%Vor%

Die Information, die ich vermisse, ist, wenn nicht sollte Ich implementiere das? Anders gefragt, warum implementiert der Compiler das nicht automatisch für mich? Da dies derzeit nicht der Fall ist, gehe ich davon aus, dass es Fälle geben muss, in denen diese Implementierung nachteilig wäre.

    
Shepmaster 01.03.2015, 21:33
quelle

2 Antworten

2

Das besondere Merkmal, das du hier schreibst, nimmt nur das Selbst als Bezug, und das ist der einzige Grund, warum es möglich ist. Aus diesem Grund ist es wahrscheinlich unerwünscht, den Parameter auf runner() als Wert zu setzen; Sie sollten es stattdessen als Referenz nehmen. Diese Richtlinie kann allgemein gelten: Wenn es möglich ist, das Merkmal für eine Referenz zu implementieren, anstatt sich zu fragen, "sollte ich es implementieren?", Sollten Sie sich fragen "warum würde ich es implementieren?" Für die einzigen Fälle wo Sie es verwenden würden, sollte wahrscheinlich geändert werden, um das Objekt durch Bezugnahme an erster Stelle zu nehmen.

    
Chris Morgan 02.03.2015, 03:48
quelle
3
  

Wann sollte ich das nicht umsetzen? Anders gefragt, warum implementiert der Compiler das nicht automatisch für mich? Da dies derzeit nicht der Fall ist, gehe ich davon aus, dass es Fälle geben muss, in denen diese Implementierung nachteilig wäre.

Zum Beispiel kam mir sofort Default in den Sinn.

%Vor%

Ich könnte es für T implementieren, aber es gibt keine Möglichkeiten, es automatisch für & amp; T zu implementieren.

    
swizard 02.03.2015 00:06
quelle

Tags und Links