2012-03-23 6 views

Odpowiedz

14

Normalnie powinno być bardziej związane z interfejsem, że zbieranie implementuje zamiast betonowej typu, to znaczy należy myśleć w kategoriach Seq, LinearSeq, a IndexedSeq zamiast List, Array i Vector, które są konkretne implementacje. Tak więc prawdopodobnie nie powinno być też toList i toArray, ale myślę, że są tam, ponieważ są tak fundamentalne.

Metoda w praktyce zapewnia toIndexedSeq dostarczenie Vector, chyba że kolekcja zastąpi to w celu zapewnienia bardziej wydajnej implementacji. Możesz również utworzyć Vector z numerem Vector() ++ c, gdzie c jest Twoją kolekcją.

+0

więc jest to dobra praktyka, aby ustawić wszystkie typy parametrów funkcji do Iterowalnych zamiast określonych typów (chyba że potrzebujesz ich dla określonej funkcjonalności/wydajności)? – sdkfasldf

+3

Jeśli potrzebujesz go do pokrycia wszystkich Iterabli, to zrób to, ale kompilator nie będzie narzekał, gdy przez pomyłkę przeszedłeś swoją metodę Mapą! Myślę, że ogólnie w OO, teoria mówi, że powinieneś zaakceptować najbardziej ogólny typ i zwrócić najbardziej konkretny. W przypadku zbiorów, zaakceptowanie zbyt ogólnych typów będzie oznaczało, że zwracany typ będzie również bardzo ogólny (zobacz to pytanie: http://stackoverflow.com/q/8235462/770361). Tak więc w praktyce metody "Lista" itp. "Seq" to dobry kompromis do korzystania z IMO. –

+4

Myślę, że i tak powinno być 'toVector'. Czasami cały ten kod do interfejsu jest ważny, jak na granicy API, ale w większości przypadków próbujesz wykonać pracę, a brak 'toVectora 'jest po prostu denerwujący. 'Wektor' to świetny zbiór ogólnego przeznaczenia; zastosowania 'List' i' Array' są raczej wyspecjalizowane. –

3

Scala 2,10 przyjdzie z metodą .to[C[_]] tak, że można napisać .to[List], .to[Array], .to[Vector] lub jakiegokolwiek innego kompatybilnego C.

+1

I '.to [Seq]' tworzy wektor, przynajmniej dla przypadków, których próbowałem. – AmigoNico

+0

@AmigoNico, ponieważ 'Seq' jest cechą, a nie konkretnym typem. – missingfaktor

+1

Tak, przykro mi - właśnie wskazywałem, że Vector został wybrany w tym przypadku. – AmigoNico

1

Scala 2.10 dodaje nie tylko .Aby [Vector], ale .toVector, a także:

W TraversableOnce cechy odziedziczył kolekcji i iteratorów:

abstract def toVector: Vector[A] 
Powiązane problemy