Scala 3.0.0 首个 RC 版本发布

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 分配给对象字段的默认初始值。它只能在类或对象中使用,而不能用来初始化一个局部变量。

我们想出了一种更好的方式来表达这种惯用语:对象中的特殊uninitialized价值scala.compiletime。要获取未初始化的字段,您现在编写:

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

import
 scala.compiletime.uninitialized


var
 
x
: A = uninitialized

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

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

猜你喜欢

转载自www.oschina.net/news/130733/scala3-rc1-released