我遇到了我的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。
通常,"manifest.mf" :: Nil
与`List(“manifest.mf”)相同。它只是一种制作或模式匹配列表的方法。
关于模式匹配(也搜索unapply
)如何在Scala中工作有很好的资源,主要用于case
语句。
这里它说:如果该列表有一个元素,那是(manifest.mf
,index.list
,dependencies
)之一然后选择MergeStrategy.discard
它是一个类的名称(是的,::
是一个类的有效名称)。它被解析为Nil.::(arg)
,因为每个方法,以冒号结束都是右联想,后者又解析为::(arg, Nil)
。这构造了一个包含给定参数的列表(将元素预先添加到现有列表中,或者如果在Nil
上调用,则创建一个)。