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。为了兼容起见,旧得名字被保留为别名。
其他改进
//> 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
scala -e "println(22*38)"
将在 standard output 上 print 836,并退出 Scala 进程。