sbt 中的 ++= 和 += 有什么区别,比如说 libraryDependencies?

What are the differences between ++= and += in sbt, say with libraryDependencies?

我是 Scala 和 sbt 的新手,我不明白它们之间的区别:

libraryDependencies ++= Seq(...)

libraryDependencies += ...

+= dep++= Seq(dep, dep2, dep3)"Of course, you can also use ++= to add a list of (read: multiple) dependencies all at once"

请参阅 collections.Seq 了解 + ("append an item") 和 ++ ("append a sequence") 运算符。

++ 运算符将作为参数给出的 Seq 添加到另一个 Seq 的末尾。

+ 将单个元素添加到 Seq.

的前面

+++后面的=表示左手Seqvar,会更新

Seq 的文档是 here

将这个问题简化为一个更简单的问题的一种方法是分开查看这两个部分。

首先是 ...= 部分。您可能熟悉 Java 和其他语言的这种语法,但它对左右操作数执行 ... 运算符,并将其存储回左操作数 - 在这种情况下,它将其存储回 libraryDependencies。

其次,可以选择 +++。如果您看一下 Seq Scaladoc,就会发现这两个运算符。这里的区别在于:

  1. + 在左侧取一个元素,并将其添加到一个序列中,return生成一个新序列作为结果。
  2. ++ 接受左边的序列和右边的序列,return 是两者的新序列。

实际上,这意味着您会从两者中得到不同的结果。

  • List(1, 2, 3) ++ List(4, 5, 6) 会 return List(1, 2, 3, 4, 5, 6),但是...
  • List(1, 2, 3) + List(4, 5, 6) 将 return List(List(1, 2, 3), 4, 5, 6).

参见Appending to previous values: += and ++=

Assignment with :=is the simplest transformation, but keys have other methods as well. If the T in SettingKey[T] is a sequence, i.e. the key’s value type is a sequence, you can append to the sequence rather than replacing it.

  • += will append a single element to the sequence.
  • ++= will concatenate another sequence.

For example, the key sourceDirectories in Compile has a Seq[File] as its value.

首先,你在sbt.build中写的东西也是Scala语法。所以这本质上是一个关于 Scala 本身的问题,并不局限于 SBT。

一般来说,在 Scala 中:

  • 可变集合中的+=函数(如ArrayBuffer[T])意味着将单个元素附加到集合中。这个函数参数的类型是T,元素的类型。
  • ++=函数,也存在于可变集合中,意思是将另一个集合的所有元素追加到你调用++=的集合中。这个函数的参数类型是 TraversableOnce[T],许多 Scala 的集合类型(如 Seq[T])都扩展了它。

例子

所以,假设您有一个 ArrayBuffer[Int] 如下所示:

val testSeq = ArrayBuffer(1, 2, 3, 4)

如果你写

testSeq += 5

testSeq 现在将变为 ArrayBuffer(1, 2, 3, 4, 5)

或者如果你写下面的而不是

testSeq += Seq(5, 6, 7, 8)

testSeq 现在将变为 ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8)

错误的例子

如果你说

testSeq ++= 5

您会看到编译错误,因为 ++= 接受集合而不是单个元素。如果你真的想通过 ++= 追加单个元素,你应该写:

testSeq ++= Seq(5)

希望这是清楚的。