2016-12-27 1 views
10

利用可能な+:::の演算子について少し混乱しています。Scalaのリスト - コロンvsダブルコロン(+:vs::)

どちらも同じ結果を示しているようです。両方の方法のための私の初心者の目のソースコードについては

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) 

(プラスコロン方法は、ビルダーの工場を利用したジェネリック医薬品に追加条件を持っている)似ています。

これらの方法のどれをいつ使用するべきですか?

+0

良い場所: 'List'の代わりに' Seq'と同じことを試してみてください... –

答えて

11

+:は任意の種類のコレクションで動作し、::Listの特定の実装です。 +:sourceをよく見ると、予想戻り値のタイプがListの場合、実際には::が呼び出されます。これは、::Listのケースではより効率的に実装されているためです。単純に新しいヘッドを既存のリストに接続し、結果を返します。これは、一般的なケースのコレクション全体を直線的にコピーするのではなく、一定時間です。+: 。あなたは空想を行うことができますので、一方

+:

は、 CanBuildFrom取るようなもの(この場合のようにきれいに見ていない、とはいえ):(それはあなたのように、この特定のケースではかなり役に立たないです

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

まずは必要な型から始めることができますが、コレクションに前置きして要素を追加し、1つの "go"でその型を変更して追加のコピーを避けることができます)。