我在我的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。
答案 0 :(得分:4)
通常,"manifest.mf" :: Nil
与`List(“ manifest.mf”)相同。
这只是使列表匹配或模式匹配的一种方法。
关于模式匹配(也搜索unapply
)在Scala中是如何工作的,有很好的资源,主要用于case
语句中。
在这里说:如果该列表包含一个元素,并且是(manifest.mf
,index.list
,dependencies
)中的一个,则选择MergeStrategy.discard
答案 1 :(得分:2)
这是一个类的名称(是的,::
是一个类的有效名称)。之所以解析为Nil.::(arg)
,是因为以冒号结尾的每种方法都是正确的关联,而后者又解析为::(arg, Nil)
。这样会构造一个具有给定参数的列表(将元素添加到现有列表中,或者在Nil
上调用时创建一个列表)。