4

重複の可能性:
Scala リスト連結、::: vs ++

Scala で、2 つのリストがあるとします。

scala> val oneTwo = List(1,2)
oneTwo: List[Int] = List(1, 2)

scala> val threeFour = List(3,4)
threeFour: List[Int] = List(3, 4)

次のようにして、リストを連結できます。

scala> oneTwo ::: threeFour
res30: List[Int] = List(1, 2, 3, 4)

または

scala> oneTwo ++ threeFour
res31: List[Int] = List(1, 2, 3, 4)

両方のアプローチの違いは何ですか?

ありがとう。

4

2 に答える 2

9

:::メソッドは に固有ですがList、はすべての++の一部ですTraversable

違いは2つのことから生じます。まず、List元の Scala コレクションの 1 つであり、コンパイラで多く使用され、特別な最適化の対象となります。::連結は、Scala の大きなインスピレーションの 1 つである ML ファミリの言語で使用されているものと同じであり、そこ:::から推定されます。

一方、++Scala 2.8.0 では Scala コレクションの再設計が行われ、メソッドと継承が統一されました。その前に(たとえば on に)存在したと思いますSetが、コレクションは共通のスーパークラスを共有していなかったため、基本的には他のコレクションのアドホックメソッドでした。

パフォーマンスに関しては、:::を上回るはず++ですが、おそらくそれほど大きくはありません。

于 2013-01-17T22:17:40.970 に答える
6

ドキュメントから:

::: [B>:A](プレフィックス:リスト[B]):リスト[B]

++ [B>:A](that:Iterable [B]):List [B]

++作品はいつでも見ることがIterableでき:::ますList

scala> val oneTwo = List(1,2)
oneTwo: List[Int] = List(1, 2)

scala> val threeFour = List(3,4)
threeFour: List[Int] = List(3, 4)

scala> val fiveSix = Array(5,6)
fiveSix: Array[Int] = Array(5, 6)

scala> oneTwo ++ fiveSix
res2: List[Int] = List(1, 2, 5, 6)

scala> oneTwo ::: fiveSix
<console>:10: error: value ::: is not a member of Array[Int]
              oneTwo ::: fiveSix
于 2013-01-17T22:10:22.220 に答える