最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Scala

运维笔记admin6浏览0评论

Scala

Scala

Jör*_*tag 5

我已经开始使用这种语法,但它叫什么 […]

它被正式称为模式匹配匿名函数。Scala 社区有时也将其称为Partial Function Literal。

[...] 我在哪里可以找到更多相关信息?

Scala 编程语言中所有内容的最终真实来源是Scala 语言规范(又名SLS)。你会注意到我已经链接到规范的 2.13 版本——不幸的是,Scala 3 的单一统一规范尚未发布。

有关所有血腥细节,请参阅Scala 语言规范 8.5模式匹配匿名函数。简而言之,表达式

{ case p1 => e1 case p2 => e2 // … case pn => en}

相当于

(x1: S1, x2: S2, /* … */, xn: Sn) => (x1, x2, /* … */, xn) match { case p1 => e1 case p2 => e2 // … case pn => en}

前提是结果类型可以SAM 转换为FunctionN[S1, S2, /* … */, Sn, R],或者作为一种特殊情况PartialFunction1[S1, R](这就是Partial Function Literal名称的来源。)

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

现在,Scala 3 是一个忽略问题 a) 的机会,但你不能忽略问题 b),因为 Scala 的主要设计目标之一是与底层主机平台(例如 .NET in现在放弃的 Scala.NET 的情况,Scala.js 的 ECMASCript / HTML5 / DOM / WebAPI 平台,Scala-native 的本机操作系统,或 Java 平台(JRE、JDK、JVM 、J2SE、J2EE、Java、Kotlin、Clojure 等)在 Scala-JVM 的情况下)。

然而,Scala 设计者设法找到了一种折衷方案,其中参数和元组不是一回事,但参数可以很容易地转换为元组,而元组可以很容易地转换为参数。

这被称为Parameter Untupling,它基本上意味着一个类型的函数FunctionN[S1, S2, /* … */, Sn, R]可以自动转换为一个类型的函数,Function1[(S1, S2, /* … */, Sn), R]它是语法糖Function1[TupleN[S1, S2, /* … */, Sn], R]。

简单的说,

(p1: S1, p2: S2, /* … */, pn: Sn) => e: R

可以自动转换为

(x: (S1, S2, /* … */, Sn)) => { val p1: S1 = x._1 val p2: S2 = x._2 // … val pn: Sn = x._n e}

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

val sVersion = CrossVersion.partialVersion(scalaVersion) .map { (major: Long, minor: Long) => s"_$major.$minor" } getOrElse ""

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

Scala

发布评论

评论列表(0)

  1. 暂无评论