Scala Set:+ vs. ++

时间:2013-02-06 08:35:14

标签: scala set

应用于集合的+和++之间有什么不同?

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]。 看起来++更普遍,但++附加值到底是什么?

5 个答案:

答案 0 :(得分: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""b"的集合,现在还包含'c' Char因此( set ++ "c")的类型现在是Set[Any]

字符串"c"可以被视为Chars的遍历。集合上的++方法接受遍历。

答案 1 :(得分:3)

来自scaladoc

看起来+旨在直接添加元素,而++旨在从其他集合添加。

也许"c"被转换为集合,如果是这样,这个方法可能会因为创建临时对象而变重一些。

答案 2 :(得分:2)

Karthik T是对的,String是(编辑:隐式转换为)一个集合,因此你可以在这里使用++。如您所见,结果集不再是Set[String]类型,而是Set[Any]。这是因为StringChar的集合,而StringChar的常见超类型是Any

答案 3 :(得分:2)

如果你看一下API doc的Set's ++方法,你会发现它需要一个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控制台上做了一些调查,然后仔细检查是否通过隐式转换进行检查。是的,它似乎是。)

答案 4 :(得分: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添加到另一个集使用++ 如果您要添加元素设置使用+