在Scala中,双冒号(或冒号)::是什么意思?

时间:2019-04-25 12:48:43

标签: scala sbt sbt-assembly

我在我的Scala项目的sbt版本中遇到了问题(重复项: META-INF/MANIFEST.MF),以下几行代码解决了该问题:

assemblyMergeStrategy in assembly := {
  case PathList("META-INF", xs @ _*) =>
    (xs map {_.toLowerCase}) match {
      case ("manifest.mf" :: Nil) | ("index.list" :: Nil) | ("dependencies" :: Nil) => MergeStrategy.discard
      case _ => MergeStrategy.last
    }
}

我现在试图理解在上述情况下双冒号的含义。我在Quora中找到了答案,但这没有帮助。

此外,我是Scala的新手,但实际上并没有帮助。

编辑:

看到答案,我仍然不明白为什么,因为我们正在创建列表,因此以下内容不起作用(重复的manifest.mf条目不会被丢弃):

case List("manifest.mf", "index.list", "dependencies") => MergeStrategy.discard

以下各项也不做:(错误:')' expected but '=>' found.):

case List("manifest.mf") | List(("index.list") | List("dependencies") => MergeStrategy.discard

编辑2:

卸下多余的支架完成以下工作:

case List("manifest.mf") | List("index.list") | List("dependencies") => MergeStrategy.discard

对于那些对该主题感兴趣的人... 5 ways to create lists in Scala

2 个答案:

答案 0 :(得分:4)

通常,"manifest.mf" :: Nil与`List(“ manifest.mf”)相同。 这只是使列表匹配或模式匹配的一种方法。

关于模式匹配(也搜索unapply)在Scala中是如何工作的,有很好的资源,主要用于case语句中。

在这里说:如果该列表包含一个元素,并且是(manifest.mfindex.listdependencies)中的一个,则选择MergeStrategy.discard

答案 1 :(得分:2)

这是一个类的名称(是的,::是一个类的有效名称)。之所以解析为Nil.::(arg),是因为以冒号结尾的每种方法都是正确的关联,而后者又解析为::(arg, Nil)。这样会构造一个具有给定参数的列表(将元素添加到现有列表中,或者在Nil上调用时创建一个列表)。