InfoQ首页 新闻 Scala 3彻底改变了语言,使开发者有更好的体验
InfoQ 7月20日直播。加快你的软件交付而不存在质量问题。现在就注册!
Scala 3对语言进行了大修,以获得更好的开发者体验
比如打印书签
Jun 24, 2021 3 min read
作者
历时八年,经过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社区作出贡献。
在3.0发布之后,预计每六周就会有新的Scala发布。开发人员可以期待下一个版本在2021年6月底发布。

我们如何为你改进InfoQ
感谢你成为InfoQ的读者。
每年,我们都会从读者那里寻求反馈,以帮助我们改进InfoQ。您是否介意花2分钟时间在我们的简短调查中分享您的反馈?您的反馈将直接帮助我们不断地改进对您的支持。
给这篇文章打分
采纳
风格
联系的作者
此内容属于Java主题
相关话题。
相关内容
-
JDK内部元素在JDK 17中被强力封装
-
Java新闻综述--2021年6月14日的一周
-
淘宝网上的 "淘宝客 "是什么?
-
Java新闻综述 - 2021年6月7日一周
-
Java新闻综述--2021年5月31日一周
-
淘宝发布开源JDBC-over-HTTP驱动
-
用Istio实现微服务化
-
淘宝网上卖的是什么?
-
Java新闻综述--2021年5月24日的一周
-
通往Quarkus 2.0的道路。架构师:持续测试
-
使用JReleaser对Java项目进行快速、无缝的发布管理
-
Java 16中的新内容
-
谷歌修改Android Material Design,改进UI工具包和Android Studio
-
Jolie--面向服务的分布式应用编程语言
-
GraalVM 21.1支持JDK 16
-
淘宝网上的 "淘宝客 "是怎样炼成的?
-
用Java、Quarkus和AWS Lambda为我的博客做无服务器搜索
-
用Quarkus和MicroProfile实现微服务化
-
升级到Java 16或17
-
在虚拟机中运行Axon服务器
-
文章系列。在Java中构建微服务
-
快速入门:研究Java的静态编译环境
-
启用Java。Windows on Arm64 - 一个成功的故事
-
测试Quarkus Web应用。反应式消息传递、Kafka和测试容器
-
Valhalla项目。为Java开发者带来性能
-
测试Quarkus网络应用程序。编写简洁的组件测试
-
测试Quarkus网络应用程序。组件和集成测试
-
虚拟面板:MicroProfile对微服务框架的影响
-
用Kotlin的Sequence接口加强流处理
-
Java特性聚焦。模式匹配
-
驴子:Clojure的高性能HTTP栈
-
Terraform 1.0版本增加了稳定性保障和改进的升级体验
-
从程序到流程,为工作场所的平等而设计
-
自主系统的验证
-
谷歌为人工智能工作负载引入新的云TPU虚拟机
-
谷歌训练20亿个参数的人工智能视觉模型
-
.NET新闻综述:.NET 6, MAUI, EF Core 6, Visual Studio 2022
-
谷歌的UI工具包Flutter 2.2称霸跨平台领域
-
数据平台中不断发展的分析
-
充分利用小团队扩展敏捷性--红帽公司的案例研究
访谈录
每周二发送的InfoQ上周的内容综述。加入由超过25万名高级开发人员组成的社区。查看示例
输入你的电子邮件地址
选择您的国家 我同意InfoQ.com按照本隐私声明中的解释处理我的数据。
陌生人你好!
你需要注册一个InfoQ账户或登录,或登录后才能发表评论。但注册的背后还有很多东西。
从InfoQ的体验中获得最大的收益。
告诉我们你的想法
允许的html:a,b,br,blockquote,i,li,pre,u,ul,p
给我发邮件回复我在这个主题中的任何信息
社区评论
观察主题
关闭
您的回复
允许的html: a,b,br,blockquote,i,li,pre,u,ul,p
给我发邮件回复我在这个主题中的任何信息
取消
关闭
您的回复
允许的html: a,b,br,blockquote,i,li,pre,u,ul,p
给我发邮件回复我在这个主题中的任何信息
取消
关闭
认可
讨论



















