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],第二个返回 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.

因此( set ++ "c")产生了一个集合,其中包含原始Set[String]"a"and"b"并且现在还包含'c'which 是 a Char,因此 of 的类型( set ++ "c")现在是 a 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是andChar的公共超类型的集合。StringCharAny

于 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)

如果您将 Set 添加到另一个 set 使用++ 如果您将元素添加到 Set 使用+

于 2013-02-06T12:41:07.973 回答