历时八年,经过28000次提交、7400次拉动请求和4100个关闭的问题,Scala 3.0已经发布,提供了"Scala语言的全面改革",包括新功能、语法和类型系统的更新,以及用于元编程的新工具。Scala兼容性参考将第3版誉为 "游戏规则的改变者,它将大大改善每个Scala程序员的日常体验"。Scala 3与Scala 2.13在二进制上是兼容的,但不完全与源代码兼容。新的Dotty编译器可以自动迁移旧代码,并报告任何遗留问题。
Scala 3.0的新语法更加简明。new
关键字现在是可选的(类似于谷歌在Dart 2.0中引入的这个功能),控制结构表达式中的小括号也是可选的。一些出现的大括号可以用源代码缩进来代替,这是Python的一个著名特征。
新的语言特性允许开发者用有意见的上下文抽象直接表达他们的意图:using
子句和given
实例简化了上下文参数,扩展方法是一流的语言公民,而implicit
转换现在被构建为scala.Conversion
类的实例。
类型系统也得到了改进,如简化的枚举;隐藏实现细节的opaque
类型;分别提供A & B
和A | B
等语法的交叉和联合类型;新的依赖函数类型,其结果取决于函数的参数;以及在Scala 2中曾经需要编译器插件的内置类型lambdas。
Scala 2中的枚举语法很冗长。请看下面的例子。
sealed trait Direction
case object East extends Direction
case object West extends Direction
Scala 3引入了一个更简洁的语法。
enum Direction:
case: East, West
随着上下文抽象的重新设计和类型系统的变化,功能编程得到了简化。面向对象的开发也得到了改进,新的功能包括:traits
接受参数并被声明为 [transparent](https://dotty.epfl.ch/docs/reference/other-new-features/transparent-traits.html)
;一个open
修饰符,明确地将类标记为开放的扩展;本着鼓励Decorator设计模式原则的精神,偏向于组合而不是继承,通过提供export
条款,为对象的选定成员定义别名。
宏在Scala 2.10中首次引入,是一个实验性的功能。Scala 3引入了一套元编程工具,其特点是:内联方法,以提高应用程序的性能;可与内联方法一起使用的编译时操作;引用代码块来构建和分析代码;以及反射API,以提供包括TASTy文件在内的类型化抽象语法树的视图。Scala 3宏的设计是为了保证稳定性,它将与未来版本的Scala兼容。然而,在这种新的元编程模型下,Scala 2.13的宏将需要重写。此外,许多Scala 2 [scaladoc](https://docs.scala-lang.org/style/scaladoc.html)
的设置已经改变,以便在Scala 3中实现参数标准化。
新的编译器选项,如:-Xignore-scala2-macros
将忽略调用Scala 2宏的代码的编译器错误;-print-tasty
将打印原始TASTy文件;-no-indent
将执行经典语法,这些只是编译代码的众多新选项中的一部分。迁移指南详细介绍了向Scala 3的迁移,并包含一个将一个完整的Scala 2.13项目移植到Scala 3的教程。
一个Scala 3.0应用程序仍然可以使用一个Scala 2.13库,即使有宏--除非不工作的宏破坏了该库。反之亦然,比如一个Scala 2.13的应用可以使用Scala 3.0的库。Scala库索引,又称Scaladex,列出了哪些库已经为Scala 3.0做好准备。
然而,这些变化是有代价的,因为有些Scala 2.13源代码与Scala 3.0不兼容。幸运的是,新的编译器包括一个迁移模式,可以自动将Scala 2代码迁移到Scala 3,并报告任何需要手动修复的剩余问题。
关于Scala 3的更多信息可以在网站的新内容部分找到。
开始使用Scala 3.0的最简单方法是使用Scastie,即Scala的在线IDE,可以在浏览器中直接编写和执行代码。文档中还演示了如何运行一个 "Hello, world "程序。
发布五周后,Scala 3.0的文档和书还没有完成,我们鼓励Scala社区作出贡献。