4

これらは実質的に同等のようです:

scala> ("asd" zip "zxc").toMap
res62: scala.collection.immutable.Map[Char,Char] = Map(a -> z, s -> x, d -> c)

scala> Map(("asd" zip "zxc"): _*)
res63: scala.collection.immutable.Map[Char,Char] = Map(a -> z, s -> x, d -> c)

しかし、実際の生活の違いは何ですか?どちらがより慣用的ですか? 実行時のパフォーマンスに違いはありますか?

同じ/同様の質問がおそらく他の類似した構造のペアについて尋ねられると確信しているので、より一般的/抽象的な答えを自由に与えてください:)

4

2 に答える 2

3

これらのメソッドが定義されている場所のため、2 つの間には実際の違いがあります。

  • apply コンストラクターは、ターゲットコレクションのコンパニオンで定義されます。

    object Coll {
      def apply[T](els: T*): Coll[T] = ???
    }
    

    これは、要素の a 以外の入力に関する情報がまったくないことを意味するSeqため、そのシーケンスをトラバースして a を構築するだけCollです。

  • 一方、、、toSeq...はソースtoArrayコレクションで定義されています。つまり、その内部に関する追加情報がすべて含まれています。

通常、toXXXメソッドは必要に応じてショートサーキットしたり、意味のある特殊なコレクションを返したりすることができます。

ばかげた例として、次のことを考慮してください。

List(1,2,3).toSeq // toSeq returns `this`, there is no overhead
// vs.
Seq(List(1,2,3): _*) // this will copy that list into a new one...

そのリストを次のように置き換えると、これはさらに悪化しStream.continually(1)ます...

于 2013-09-08T22:10:25.023 に答える