2016-12-27 28 views
10

Şu an mevcut olan +: ve :: işletmenleri hakkında biraz endişe duyuyorum.Scala - plus kolon vs çift kolon (+: vs: :)

Her ikisi de aynı sonuçları veren gibi görünüyor. Her iki yöntem için zaman acemi göz kaynak kodu için

scala> List(1,2,3) 
res0: List[Int] = List(1, 2, 3) 

scala> 0 +: res0 
res1: List[Int] = List(0, 1, 2, 3) 

scala> 0 :: res0 
res2: List[Int] = List(0, 1, 2, 3) 

içindeki (artı-kolon yöntemi oluşturucu fabrikaları kullanımı ile jenerik ek durum vardır) bakar.

Bu yöntemlerden hangisi kullanılmalıdır ve ne zaman kullanılmalıdır?

+0

Başlamak için iyi bir yer: "Liste" yerine "Seq" ile aynı şeyi deneyin ... –

cevap

11

+: koleksiyonun her türlü eserler :: iken List için spesifik bir uygulamasıdır. +: için source'a yakından bakarsanız, beklenen dönüş türü List olduğunda gerçekte :: aradığını fark edeceksiniz. Bunun nedeni, ::'un List durumu için daha verimli bir şekilde uygulandığından kaynaklanmaktadır: yeni kafayı yalnızca mevcut listeye bağlar ve tüm koleksiyonu, +: genel örneğinde doğrusal kopyalamanın tersine, sabit zamanlı bir işlem olan sonucu döndürür . Eğer fantezi yapmak, böylece diğer taraftan

+:

, CanBuildFrom alır gibi şeyler (bu durumda olduğu gibi güzel görünümlü değil, olsa): (Size olarak, bu özel durumda oldukça işe yaramaz

val foo: Array[String] = List("foo").+:("bar")(breakOut) 

Başlamak için gerekli olan türden başlayabilir, ancak fikir bir koleksiyona başlatabilir ve öğeyi ekleyebilir ve türünü bir "go" olarak değiştirebilir, ek bir kopyadan kaçınabilirsiniz).