应用于集合的+和++之间有什么不同?
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]。 看起来++更普遍,但++附加值到底是什么?
答案 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)
答案 2 :(得分:2)
Karthik T是对的,String是(编辑:隐式转换为)一个集合,因此你可以在这里使用++
。如您所见,结果集不再是Set[String]
类型,而是Set[Any]
。这是因为String
是Char
的集合,而String
和Char
的常见超类型是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添加到另一个集使用++
如果您要添加元素设置使用+