【问题标题】:What does double colon (or colon-colon) :: mean in Scala?双冒号(或冒号-冒号):: 在 Scala 中是什么意思?
【发布时间】:2019-09-14 21:49:46
【问题描述】:

我的 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

但以下是:

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

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

【问题讨论】:

  • 因为你没有创建一个包含三个元素的列表(你还有一个额外的括号)。它使用 and or 将输入与三个不同的列表进行比较。

标签: scala collections functional-programming sbt sbt-assembly


【解决方案1】:

一般来说,"manifest.mf" :: Nil 和 `List("manifest.mf") 是一样的。 这只是一种制作或模式匹配列表的方法。

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

这里说:如果该列表有一个元素,并且是 (manifest.mf,index.list,dependencies) 之一,则选择 MergeStrategy.discard

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-09-25
    • 1970-01-01
    • 2012-10-09
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多