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

双冒号(或冒号)::在Scala中是什么意思?,scala,collections,functional-programming,sbt,sbt-assembly,Scala,Collections,Functional Programming,Sbt,Sbt Assembly,我的Scala项目(重复条目:META-INF/MANIFEST.MF)的sbt构建出现问题,以下几行解决了问题: assembly中的assemblyMergeStrategy:={ 案例路径列表(“META-INF”,xs@*)=> (xs映射{{toLowerCase})匹配{ 大小写(“manifest.mf”::Nil)|(“index.list”::Nil)|(“依赖项”::Nil)=>MergeStrategy.discard 案例=>MergeStrategy.last } }

我的Scala项目(重复条目:
META-INF/MANIFEST.MF
)的
sbt
构建出现问题,以下几行解决了问题:

assembly中的assemblyMergeStrategy:={
案例路径列表(“META-INF”,xs@*)=>
(xs映射{{toLowerCase})匹配{
大小写(“manifest.mf”::Nil)|(“index.list”::Nil)|(“依赖项”::Nil)=>MergeStrategy.discard
案例=>MergeStrategy.last
}
}
我现在试图理解双冒号在上述上下文中的含义。我在中找到了答案,但这没有帮助

此外,我是Scala的新手,这并没有真正的帮助

编辑:

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

案例列表(“manifest.mf”、“index.List”、“dependencies”)=>MergeStrategy.discard
但以下情况确实如此:

案例列表(“manifest.mf”)|列表(“index.List”)|列表(“依赖项”)=>MergeStrategy.discard
对于那些对这个话题感兴趣的人

它是一个类的名称(是的,
是一个类的有效名称)。它被解析为
Nil:(arg)
,因为每个以冒号结尾的方法都是右关联的,而右关联又被解析为
:(arg,Nil)
。这将使用给定的参数构造一个列表(将元素前置到现有列表中,或者在
Nil
上调用时创建一个元素)。

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

关于模式匹配(也包括搜索
unapply
)在Scala中的工作原理,有很多很好的资源,主要用于
case
语句


这里它说:如果该列表有一个元素,而该元素是(
manifest.mf
index.list
dependencies
)中的一个,那么选择
MergeStrategy.discard

,因为您没有创建包含三个元素的列表(另外还有一个括号)。它使用and或将输入与三个不同的列表进行比较。添加官方文档的链接: