2013-03-04 27 views
9

Vor der Version 2.10 der Scala Sequenztypen hatten Methoden wie toList und toArray für die Umwandlung von einem Typ zu einem anderen. Ab Scala 2.10 haben wir to[_], z.B. to[List], die toList und Freunde zu subsumieren scheint und geben uns auch die Möglichkeit, zu neuen Typen wie Vector und vermutlich sogar zu unseren eigenen Sammlungstypen zu konvertieren. Und natürlich gibt es Ihnen die Möglichkeit, in einen Typ zu konvertieren, den Sie nur als Typparameter kennen, z. to[A] - schön!Warum sind toList und Freunde nicht veraltet?

Aber warum wurden die alten Methoden nicht veraltet? Sind sie schneller? Gibt es Fälle, in denen toList funktioniert, aber to[List] nicht? Sollten wir beide vorziehen, wo beide arbeiten?

Antwort

7

toList ist in TraversableOnce als to[List] implementiert, so dass es keinen merklichen Leistungsunterschied gibt.

toArray ist jedoch (sehr geringfügig) effizienter als to[Array], da das erstere ein Array der richtigen Größe zuweist, während das zweite zuerst ein Array erstellt und dann den Größenhinweis festlegt (wie für jeden Zielsammeltyp). Dies sollte keinen Unterschied in einer realen Anwendung machen, es sei denn, Sie konvertieren Daten in Arrays in einer engen Schleife.

Die alten Methoden leicht veraltet sein könnte, und ich wette, sie in der Zukunft werden, aber die Menschen sind ihnen so verwendet, dass sie sofort deprecating wahrscheinlich einige Leute wütend machen würde.

+3

'toXXX' leicht überschrieben werden, wie es der Fall für [' toList'] (https: // github.com/scala/scala/blob/v2.10.0/src/library/scala/collection/immutable/List.scala#L196), nicht nur für 'toArray'. – sschaef

+0

In der Tat ist es einfacher als überschreiben und Sonderfall 'to'. –

+1

Ummm, Samuel, du siehst furchtbar jung aus - weiß deine Mutter, dass du den Quellcode der Scala-Sammlungen anschaust? – AmigoNico

2

Auf Frage scheint zu sein, dass Sie nicht auf [] in Postfix-Notation verwenden:

scala> Array(1,2) toList 
res2: List[Int] = List(1, 2) 

scala> Array(1,2) to[List] 
<console>:1: error: ';' expected but '[' found. 
     Array(1,2) to[List] 

scala> Array(1,2).to[List] 
res3: List[Int] = List(1, 2) 
+2

'xs toList' erzeugt eine Warnung, verstecke diese nicht. – sschaef

+3

@sschaef: Nicht, wenn Sie eine "Import scala.language.postfixOps" durchführen – BeniBela

Verwandte Themen