Wie der Titel dieser Frage nahelegt: Meine Frage betrifft mehr die Form (idiomatische Konvention) als die Funktion. Setzen Sie kurz:
Was ist der semantische Unterschied zwischen
MyCollectionLike
undMyCollection
?
Als Beispiele: Was ist der Unterschied zwischen StringLike
und String
oder MapLike
und Map
. Bei genauerer Betrachtung der Scala-API-Dokumente kann ich feststellen, dass XLike
normalerweise ein Super-Typ von X
ist. Aber darüber hinaus ist mir der semantische Unterschied zwischen diesen Schichten der Abstraktion nicht klar.
Wenn ich in der Praxis eine neue Klasse / Eigenschaft erstellen würde, wäre es hilfreich, diese Unterscheidung zu verstehen, wenn ich Namen für diese Klasse auswähle.
Mein spezifisches Problem, wo dies aufgetreten ist, ist wie folgt:
Ich möchte das Merkmal erstellen:
SurjectiveMap[K, T]
, das mitMap[K, Set[T]]
oderMapLike[K, SetLike[T]]
gemischt werden kann. Da ich den semantischen Unterschied zwischen*Like
und*
nicht kenne, bin ich mir nicht sicher, mit welchem ich gehen soll.
Derselbe Unterschied wie zwischen IFoo und Foo, Bar und BarImpl (außer der Tatsache, dass TraversableLike Super-Trait ist, das eine Implementierung enthält):
Die Scala Collection Bibliothek vermeidet Code Duplikation und erreicht die "selbe-result-type" -Prinzip durch Verwendung von generischen Buildern und Traversalen Über Sammlungen in sogenannten Implementierungsmerkmalen. Diese Eigenschaften sind benannt mit einem Like-Suffix; Zum Beispiel ist IndexedSeqLike das Implementierungsmerkmal für IndexedSeq, und ähnlich ist TraversableLike das Implementierungsmerkmal für Traversable. Sammlungsklassen wie Traversable oder IndexedSeq erben alle ihre konkrete Methode Implementierungen aus diesen Eigenschaften.
Ich denke, mit den Like
traits können Sie die Retourentypen (Repräsentation) verfeinern. Dies erfordert viel mehr Arbeit. Vergleichen Sie:
versus
%Vor% Das Merkmal MapLike
muss nach dem Merkmal Map
eingefügt werden, damit die richtigen Rückgabetypen aktiviert werden.
Trotzdem bekommt man nicht alles umsonst. Sie müssen mehr Methoden überschreiben:
%Vor%Tags und Links scala design scala-collections naming