Scala中双重冒号(或冒号)的意思是什么意思?

问题描述 投票:0回答:2

我遇到了我的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

scala sbt sbt-assembly
2个回答
4
投票

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

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

这里它说:如果该列表有一个元素,那是(manifest.mfindex.listdependencies)之一然后选择MergeStrategy.discard


2
投票

它是一个类的名称(是的,::是一个类的有效名称)。它被解析为Nil.::(arg),因为每个方法,以冒号结束都是右联想,后者又解析为::(arg, Nil)。这构造了一个包含给定参数的列表(将元素预先添加到现有列表中,或者如果在Nil上调用,则创建一个)。

© www.soinside.com 2019 - 2024. All rights reserved.