Scala 3.0.0 首个 RC 版本发布

来源: OSCHINA
编辑: 局长
2021-02-23

Scala 3.0.0 首个预览版本已发布,此版本旨在进行最后阶段的打磨、代码清理和修改。此外还有可用于改进开发体验的语言方面变更,以及针对元编程框架 (Metaprogramming) 的优化。

支持在扩展方法中使用辅助类型参数列表

扩展的类型参数现在可以与方法本身的类型参数相结合。例如:

List(1, 2, 3).second[Int]
extension [A](xs: List[A])
   def sumBy[B](f: A => B)(using Numeric[B]): B = ...

与方法类型参数相匹配的类型参数可以照常传递:

List("a", "bb", "ccc").sumBy[Int](_.length)

相比之下,只有当方法被引用为非扩展方法时,才可以传递与扩展后的类型参数相匹配的类型参数:

sumBy[String](List("a", "bb", "ccc"))(_.length)

或者,当传递两个类型参数时:

sumBy[String](List("a", "bb", "ccc"))[Int](_.length)

查看文档了解跟更多关于扩展方法的信息。

引入新的import语法

以下是此版本中对import语法的更改:

通配符导入符号_被替换为*,原因是大多数其他语言都使用*

import scala.annotation.*  // imports everything in the annotation package

重命名运算符=>将替换为软关键字(soft keyword)asas也可以在大括号外使用。例如:

import scala.collection.mutable as mut
import NumPy as np

使用uninitialized进行通配符初始化

在 var 定义中使用了晦涩的_用法:

var x: T = _

此处定义了一个没有初始值的具体变量 x,或者说是 JVM 分配给对象字段的默认初始值。它只能在类或对象中使用,而不能用来初始化一个局部变量。

对于这种惯常用法,Scala 开发团队想出了一种更好的表达方式:在scala.compiletime 对象中使用特殊的uninitialized值。如需获取未初始化的字段,可以这样写:

import scala.compiletime.uninitialized

var x: A = uninitialized

这种方式比简单地写一个下划线更简洁易读。

除此之外还有关于元编程和语言方面的变更,详情查看发布公告

展开阅读全文
5 收藏
分享
加载中
精彩评论
你学废了吗
2021-02-23 22:03
1
举报
好,终于要3.0了
2021-02-23 16:20
1
举报
這語言難度嚇退了許多人。
2021-02-23 09:45
1
举报
最新评论 (6)
一个比c++还可怕的存在。。。
2021-03-01 16:59
0
回复
举报
scala能干啥?
2021-02-26 11:14
0
回复
举报
你学废了吗
2021-02-23 22:03
1
回复
举报
好,终于要3.0了
2021-02-23 16:20
1
回复
举报
期待3.0正式版!
2021-02-23 12:24
0
回复
举报
這語言難度嚇退了許多人。
2021-02-23 09:45
1
回复
举报
更多评论
6 评论
5 收藏
分享
返回顶部
顶部