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

时间:2015-06-27 09:47:22

标签: scala sbt

我是Scala的新手,并且我无法理解它们之间的区别:

libraryDependencies ++= Seq(...)

libraryDependencies += ...

5 个答案:

答案 0 :(得分:15)

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

+查看++(“追加项目”)和<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <ExcludeFromPackageFiles Include="bin\IBM.Data.DB2.dll"> <FromTarget>Project</FromTarget> </ExcludeFromPackageFiles> </ItemGroup> </Project> (“附加序列”)运算符。

答案 1 :(得分:7)

请参阅Appending to previous values: += and ++=

  

使用:=进行分配是最简单的转换,但键也有其他方法。如果T中的SettingKey[T]是序列,即键的值类型是序列,则可以附加到序列而不是替换序列。

     
      
  • +=会在序列中添加一个元素。
  •   
  • ++=将连接另一个序列。
  •   
     

例如,键sourceDirectories in Compile的值为Seq[File]

答案 2 :(得分:2)

将此问题解决为一个更简单的问题的一种方法是分离两个部分。

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

其次,可以选择+++。如果您查看Seq Scaladoc,那么您将找到这两个运算符。这里的区别在于:

  1. +在左侧使用一个元素,并将其添加到序列中,然后返回一个新序列。
  2. ++在左侧显示一个序列,在右侧显示一个序列,并返回两者的新序列。
  3. 在实践中,这意味着您将从两者中获得不同的结果。

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

答案 3 :(得分:2)

首先,您在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)

希望这很清楚。

答案 4 :(得分:1)

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

+Seq的前面添加了一个元素。

=+之后的++表示左手Seqvar并且会更新。

Seq的文档是here