4

セットに適用する+と++の違いは何ですか?

scala> val set = Set[String]("a","b")
set: scala.collection.immutable.Set[String] = Set(a, b)

scala> set + "c"
res2: scala.collection.immutable.Set[String] = Set(a, b, c)

scala> set ++ "c"
res3: scala.collection.immutable.Set[Any] = Set(a, b, c)

最初はSet[String]を返し、2番目はSet[Any]を返します。++の方が一般的ですが、++の付加価値は正確には何ですか?

4

5 に答える 5

9

これにより、次のことが明確になります。

 ( set ++ "c") contains "a"  // true; "a" is a String in this set.


 ( set ++ "c") contains "c"  // false, "c" is a NOT a string in this set.

 ( set ++ "c") contains 'c'  // true, 'c' is a CHAR in this set.

そのため、元のwithを( set ++ "c")含むセットが生成され、現在はwhichも含まれているため、 のタイプは a になりました。Set[String]"a""b"'c'Char( set ++ "c")Set[Any]

String"c"は のトラバース可能と見なすことができますChars。セットの++メソッドは、トラバーサブルを受け入れます。

于 2013-02-06T08:41:25.543 に答える
3

スカドックから

+要素を直接追加するように設計されているのに対し++、別のコレクションから追加するように設計されているようです。

おそらく は "c"コレクションに変換されます。その場合、一時オブジェクトが作成されるため、このメソッドは少し重くなる可能性があります。

于 2013-02-06T08:38:10.320 に答える
2

Karthik T は正しく、String は (編集: 暗黙的に変換された) コレクションであるため、++ここで使用できます。ご覧のとおり、結果のセットは型ではなくなりましSet[String]たが、 if Set[Any]. これは、 aStringが のコレクションでCharあり、 and の共通のスーパータイプであるStringためCharですAny

于 2013-02-06T08:44:19.327 に答える
2

Set の ++ メソッドのAPI ドキュメントを見ると、GenTraversableOnce が必要であることがわかります。

scala> val c:GenTraversableOnce[Any] = "c"
c: scala.collection.GenTraversableOnce[Any] = c

つまり、この場合は次のようになります。

scala> set ++ "c"
res3: scala.collection.immutable.Set[Any] = Set(a, b, c)

"c" は GenTraversableOnce[Any] であり、++ メソッドはそのコレクションのすべての要素を追加しています。

(他の多くの回答者と同様に、Scala コンソールを少しいじって確認し、それが暗黙の変換によるものかどうかを再確認しただけだと思います。はい、そうです。)

于 2013-02-06T08:46:04.800 に答える
0

明確な違いを得るために REPL でこれを試してください

val set = Set[Int](1,2)

set + 3 //res0: = ...set[Int] = (1,2,3)
set + Set[Int](3,4)  //Type mismatch
set ++ Set[Int](3,4) //res5: ...set[Int] = (1,2,3,4)

セットを別のセットに追加する++ 場合は、要素をセットに追加する場合に使用します+

于 2013-02-06T12:41:07.973 に答える