Scala - 这个映射+案例语法是什么?

Kur*_*urt 2 scala

我似乎无法找到有关此语言功能的更多信息,您可以在case其中放入map像这样的内容:

   val sVersion = CrossVersion.partialVersion(scalaVersion)
      .map { case (major:Long, minor: Long) => s"_$major.$minor" } getOrElse ""
Run Code Online (Sandbox Code Playgroud)

我已经开始使用这种语法,但它叫什么?在哪里可以找到更多有关它的信息?

Jör*_*tag 5

\n

我已经开始使用这种语法,但是它叫什么 [\xe2\x80\xa6]

\n
\n

它的正式名称是模式匹配匿名函数。Scala 社区有时也将其称为偏函数文字

\n
\n

[\xe2\x80\xa6] 在哪里可以找到更多信息?

\n
\n

Scala 编程语言中所有内容的最终真相来源是Scala 语言规范(又名SLS。您会注意到,我已经链接到规范\xc2\xa0\xe2\x80\x93 的 2.13 版本,不幸的是,Scala 3 的单一综合规范尚未发布。

\n

有关所有详细信息,请参阅Scala 语言规范 8.5模式匹配匿名函数。简单地说,表达式

\n
{\n  case p1 => e1\n  case p2 => e2\n  // \xe2\x80\xa6\n  case pn => en\n}\n
Run Code Online (Sandbox Code Playgroud)\n

相当于

\n
(x1: S1, x2: S2, /* \xe2\x80\xa6 */, xn: Sn) => (x1, x2, /* \xe2\x80\xa6 */, xn) match {\n  case p1 => e1\n  case p2 => e2\n  // \xe2\x80\xa6\n  case pn => en\n}\n
Run Code Online (Sandbox Code Playgroud)\n

前提是结果类型可以 SAM 转换FunctionN[S1, S2, /* \xe2\x80\xa6 */, Sn, R], 或作为特殊情况(这就是部分函数文字PartialFunction1[S1, R]名称的由来。)

\n

在 Scala 3 中,有一个新功能可以使代码更加简洁:很长一段时间以来,Scala 设计者都希望统一元组参数列表。换句话说,他们希望 Scala 中的方法只接受一个参数,并且该参数是一个元组。不幸的是,事实证明,a)这极大地破坏了向后兼容性,b)极大地破坏了平台互操作性。

\n

现在,Scala 3 是一个忽略问题 a) 的机会,但您不能忽略问题 b),因为 Scala 的主要设计目标之一是与底层主机平台(例如 .NET)进行无缝、紧密、良好、高性能的集成。对于现已废弃的 Scala.NET,对于 Scala.js 来说是 ECMASCript / HTML5 / DOM / WebAPI 平台,对于 Scala-native 来说是原生操作系统,或者是 Java 平台(JRE、JDK、JVM) 、J2SE、J2EE、Java、Kotlin、Clojure 等)(对于 Scala-JVM)。

\n

然而,Scala 设计者设法找到了一个折衷方案,即参数和元组不是一回事,但参数可以轻松转换为元组,元组也可以轻松转换为参数。

\n

这称为参数解组,它基本上意味着类型的函数可以自动转换为语法糖FunctionN[S1, S2, /* \xe2\x80\xa6 */, Sn, R]类型的函数。Function1[(S1, S2, /* \xe2\x80\xa6 */, Sn), R]Function1[TupleN[S1, S2, /* \xe2\x80\xa6 */, Sn], R]

\n

简单的说,

\n
(p1: S1, p2: S2, /* \xe2\x80\xa6 */, pn: Sn) => e: R\n
Run Code Online (Sandbox Code Playgroud)\n

可以自动转换为

\n
(x: (S1, S2, /* \xe2\x80\xa6 */, Sn)) => {\n  val p1: S1 = x._1\n  val p2: S2 = x._2\n  // \xe2\x80\xa6\n  val pn: Sn = x._n\n\n  e\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这样,您的代码将如下所示:

\n
val sVersion = CrossVersion.partialVersion(scalaVersion)\n  .map { (major: Long, minor: Long) => s"_$major.$minor" } getOrElse ""\n
Run Code Online (Sandbox Code Playgroud)\n
\n

注意:不幸的是,Scala 3 还没有全面的规范。有部分语言参考,但仅描述了与 Scala 2 的差异。因此,您通常必须在 SLS 和 Scala 3 文档之间来回切换。

\n