Scala 3.1.2 发布

Scala 3.1.2 已发布,这个新版本带来了一些社区所期待的重大改进。具体更新亮点有:

可配置的 Scala output version

新版本带来了一种实验性的配置 Scala output version 的可能性。这意味着编译器现在可以生成 TASTy 文件和 classfiles,其格式由较早的 Scala 小版本使用(目前只能是 3.0.x),有效地指定了能够阅读你的编译代码的最小版本的编译器。

使用 Scala 3.1.2 编译库时,可以将 output version 设置为 Scala 3.0。然后,你的库可以被使用 Scala 3.0、3.1 或任何未来版本编译的代码使用。所有生成的 TASTy 文件都将与 Scala 3.0 和更高版本兼容。

虽然编译器设置本身没有明确标记为实验性(其相应的标志在其名称中没有-X-Y前缀),但它在更广泛的 Scala 库生态系统中的作用尚未确定。官方表示,其正等待着库的维护者的反馈。希望听取大众的意见以促使选择正确的策略来支持为以前的 Scala 版本编译的代码,以便可以在兼容性和语言发展的可能性之间找到平衡。

Current support

你可以通过使用一个新的编译器标志来设置 Scala output version,该标志名为 -scala-output-version,并以一个次要的发布版本作为参数。

从 1.7.0-M1 版本开始,有一个 scalaOutputVersion,它不仅可以设置编译器标志,还可以决定哪个版本的标准库将被指定为你项目的依赖。

scalaOutputVersion 被设计为在你仍然被迫交叉编译的情况下也能顺利工作(例如,如果你的项目包含宏但你想同时支持 Scala 2 和 3)。在这种情况下,如果 scalaVersion 中的编译器还不支持 -scala-output-version 标志,你只需要确保 scalaOutputVersion 被设置为与 scalaVersion 相同的值(相当于不定义 scalaOutputVersion)。例如

ThisBuild / scalaVersion := "3.1.2"
ThisBuild / crossScalaVersions := List("2.13.8", "3.1.2")
ThisBuild / scalaOutputVersion := {
  CrossVersion.partialVersion(scalaVersion.value) match {
    case Some((3, _)) => "3.0.2"
    case _ => scalaVersion.value
  }
}

对其他兼容性标志的修改

目前的 output compatibility flags 有一些混乱,增加一个新的标志只会使情况更糟。因此,官方决定重新命名现有的标志。-release 现在是 -java-output-version,而- Xtarget 是 -Xunchecked-java-output-version。为了兼容起见,旧的名字被保留为别名。

其他改进

  • 现在你可以在编译过程中传递 -Xmacro-settings 标志,以自定义代码中的宏的行为。这个功能仍然是试验性的。例如,你可以用 -Xmacro-settings:present,key=value 编译以下代码:
//> using options "-Xmacro-settings:present,key=value"

import scala.quoted.*

inline def customizable = ${ customizableImpl }

def customizableImpl(using Quotes) =
  import quotes.reflect.*
  val settings = CompilationInfo.XmacroSettings

  val present    = settings.contains("present")       // true
  val notPresent = settings.contains("not-present")   // false
  val withValue  = settings.collectFirst {            // Some("value")
    case s"key=$value" => value
  }

  ??? // Do something fancy with your settings
  • 你可以用 -e flag 运行 scala 命令,从命令行快速执行 Scala 语句。
  scala -e "println(22*38)"

将在 standard output 上 print 836,并退出 Scala 进程。

  • 在 typer 中有一些新的优化,在某些情况下可能会导致显著的速度提升。你可以在相关的 PR 中找到更多信息和基准测试结果。

更多详情可查看官方博客

猜你喜欢

转载自www.oschina.net/news/193182/scala-3-1-2-released