Idiomatische Scala: Semantischer Unterschied zwischen CollectionLike und Collection-Typen?

8

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 und MyCollection ?

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 mit Map[K, Set[T]] oder MapLike[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.

    
Ryan Delucchi 29.05.2013, 21:28
quelle

2 Antworten

3

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.

von Scala Collections Architektur

    
om-nom-nom 29.05.2013, 21:33
quelle
1

Ich denke, mit den Like traits können Sie die Retourentypen (Repräsentation) verfeinern. Dies erfordert viel mehr Arbeit. Vergleichen Sie:

%Vor%

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%     
0__ 30.05.2013 00:46
quelle