2013-03-04 22 views
9

Przed wersją 2.10 Scala typy sekwencji miały metody takie jak toList i toArray do konwersji z jednego typu do drugiego. Od wersji Scala 2.10 mamy to[_], np. to[List], który wygląda na subskrypcję toList i znajomych, a także daje nam możliwość konwersji na nowe typy, takie jak Vector i przypuszczalnie nawet do naszych własnych typów kolekcji. I oczywiście daje możliwość konwersji na typ, który znasz tylko jako parametr typu, np. to[A] - miło!Dlaczego lista i lista przyjaciół nie jest przestarzała?

Ale dlaczego stare metody nie były przestarzałe? Czy są szybsze? Czy istnieją przypadki, w których toList działa, ale nie? Czy powinniśmy preferować jeden nad drugim, gdzie oba działają?

Odpowiedz

7

toList jest zaimplementowana w TraversableOnce jako to[List], więc nie będzie zauważalnej różnicy w wydajności.

Jednak toArray jest (bardzo nieznacznie) bardziej wydajny niż to[Array], ponieważ poprzedni przydziela tablicę o właściwym rozmiarze, podczas gdy drugi tworzy najpierw tablicę, a następnie ustawia wskazówkę dotyczącą wielkości (tak jak ma to miejsce w przypadku każdego typu kolekcji docelowej). Nie powinno to wpływać na rzeczywistą aplikację, chyba że konwertujesz dane na tablice w ciasnej pętli.

Stare metody mogą łatwo zostać uznane za przestarzałe, i założę się, że będą w przyszłości, ale ludzie są tak przyzwyczajeni, że ich natychmiastowe odstąpienie prawdopodobnie złościłoby niektórych ludzi.

+3

'toXXX' można łatwo nadpisane, podobnie jak to ma miejsce w przypadku [' toList'] (https: // github.com/scala/scala/blob/v2.10.0/src/library/scala/collection/immutable/List.scala#L196), nie tylko dla 'toArray'. – sschaef

+0

Rzeczywiście, jest łatwiejsze niż nadpisywanie i specjalny przypadek 'na'. –

+1

Ummm, Samuel, wyglądasz okropnie młodo - czy twoja matka wie, że patrzysz na kod źródłowy kolekcji Scala? – AmigoNico

2

W kwestii wydaje się, że nie można wykorzystywać do [] w notacji postfix:

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' generuje ostrzeżenie, nie ukrywaj tego. – sschaef

+3

@sschaef: Nie, jeśli robisz 'import scala.language.postfixOps' – BeniBela

Powiązane problemy