Die Einschränkungen von Erweiterungsmerkmalen umgehen

8

Das Muster, ob eine objektsichere Eigenschaft Foo und eine (potentiell unsichere) Erweiterungseigenschaft FooExt für alle Instanzen von Foo implementiert wurde, scheint nun Standard zu werden.

Ссылка

Das ist ein Problem für mich im Fall von Iterator<A> , da ich eine Bibliothek habe, die die Standardmethode IteratorExt#last() des alten Iteratormerkmals überschreibt (die zugrunde liegende Bibliothek hat eine effiziente Implementierung von last() ). Dies ist nun unmöglich, weil für jede A immer eine widersprüchliche Eigenschaften-Implementierung von IteratorExt vorhanden ist, die libcore bereits für alle Iterator<A> bereitstellt.

iterator.rs:301:1: 306:2 error: conflicting implementations for trait 'core::iter::IteratorExt' [E0119]

%Vor%

Nun, soweit ich das sehe, habe ich zwei Möglichkeiten:

  • habe mein eigenes Merkmal und meine eigene last() Implementierung. Das würde bedeuten, dass es Konflikte gibt, wenn IteratorExt importiert wird, es sei denn, es wird sorgfältig verwendet. Dies hat auch die Gefahr, dass versehentlich eine ineffiziente Version von last() verwendet wird, wenn die Version von IteratorExt verwendet wird. Ich würde den bequemen Zugang zu IteratorExt verlieren.
  • habe mein eigenes Merkmal und benenne die Methode anders ( seek_last() ). Nachteil: Ich bitte den Benutzer, Vokabeln zu lernen und meine Methode immer gegenüber der von IteratorExt zu bevorzugen. Gleiches Problem: Ich möchte die versehentliche Verwendung von last() vermeiden.

Gibt es noch eine andere, bessere Lösung, die mir fehlt?

    
Skade 03.12.2014, 09:19
quelle

2 Antworten

2

Ab rustc 0.13.0-nightly (8bca470c5 2014-12-08 00:12:30 +0000) defining last() als inhärente Methode für Ihren Typ sollte funktionieren.

%Vor%

Da Sie keine Extension-Merkmale als generische Grenzen verwenden sollen (sondern nur um zusätzliche Methoden bereitzustellen), sollte dies theoretisch für Ihr Szenario funktionieren, da Sie Ihren eigenen Typ und seine impl in derselben Kiste haben können.

Benutzer Ihres Typs verwenden die inhärente Methode last anstatt der Methode IteratorExt , können aber weiterhin die anderen Methoden für IteratorExt verwenden.

    
Paolo Falabella 11.12.2014, 16:49
quelle
0

last sollte in Iterator anstatt in IteratorExt verschoben werden.

IteratorExt wird benötigt, wenn Box<Iterator> -Objekte verwendet werden, um den Aufruf generischer Methoden zu ermöglichen (z. B. map ), weil Sie keine generische Methode in eine vtable einfügen können. % Co_de% ist jedoch nicht generisch, daher kann es in last eingefügt werden.

    
user3952229 08.12.2014 09:16
quelle

Tags und Links