Dart 3正式发布:100%健全的空值安全、迄今为止最大版本
出品 | OSC开源社区(ID:oschina2013)
100% 健全的空值安全
null
,那么它永远不可能是 null
。这避免了某些类别的编码错误,例如空指针异常。它还允许编译器和运行时以没有空安全性无法实现的方式优化代码。虽然这种设计会使得迁移变得有点困难,但开发团队认为,他们为 Dart 做出了正确的选择。主要语言特性 —— 记录、模式和类修饰符
( String , int ) userInfo( Map < String , dynamic > json) { return (json[ 'name' ] as String , json[ 'height' ] as int ); }
==
运算符和 hashCode
函数。name
和 height
。然后可以像任何其他变量一样使用这些变量,例如调用 print
时:var (String name, int height) = userInfo({'name': 'Michael', 'height': 180});
print('User $name is $height cm tall.');
类似的模式也存在于 lists 和 maps 中。对于所有这些,你可以使用下划线模式跳过单个元素:
var (String name, _) = userInfo(…);
switch
语句的功能和表现力。现在已经消除了在每个案例末尾添加 break
的需要,还支持逻辑运算符来组合案例。示例:switch (charCode) {
case slash when nextCharCode == slash:
skipComment();
case slash || star || plus || minus:
operator(charCode);
case >= digit0 && <= digit9:
number();
default:
invalid();
}
模式的一个强大功能是能够检查 “exhaustiveness”,此功能可确保 switch 可以处理所有可能的情况。
sealed classAnimal{ … }
classCowextendsAnimal{ … }
classSheepextendsAnimal{ … }
classPigextendsAnimal{ … }
String whatDoesItSay(Animal a) =>
switch (a) { Cow c => '$c says moo', Sheep s => '$s says baa' };
这将返回以下错误,提醒错过了最后一个可能的子类型 Pig 的处理:
line 6 • The type 'Animal' is not exhaustively matched by the switch cases
since it doesn't match 'Pig()'.
if
语句也可以使用模式:final json = {'name': 'Michael', 'height': 180};
// Find Michael's height.
if (json case {'name': 'Michael', 'height': int h}) {
print('Michael is $h cm tall.');
} else {
print('Error: json contains no height info for Michael!');
}
具有类修饰符的类的细粒度访问控制
classVehicle{
String make; String model;
void moveForward(int meters) { … }
}
// Construct.
var myCar = Vehicle(make: 'Ford', model: 'T',);
// Extend.
classCarextendsVehicle{
int passengers;
}
// Implement.
classMockVehicleimplementsVehicle{
@override void moveForward …
}
使用
interface class
,你可以定义一个契约供其他人实施。不能扩展接口类。使用
base class
,你可以确保类的所有子类型都继承自它,而不是实现它的接口。这确保私有方法在所有实例上都可用。使用
final class
,你可以关闭类型层次结构以防止你自己的库之外的任何子类。作为一个 sample 好处,这允许 API 所有者添加新成员,而不会冒破坏 API 使用者更改的风险。
展望未来
查看 Dart 3 之后的次要版本是否需要对记录、模式和类修饰符进行更新。
研究一些更小、更增量的功能,这些功能完全不具破坏性,并且专注于提高开发者的生产力,而没有迁移成本。正在探索的两个示例是用于使用零成本 “wrappers” 以包装现有类型的内联类,和 primary constructors,它引入了一种更简洁的语法来定义具有几个字段和一个 primary constructor 的类。
关注宏(也称为元编程),以便更好地反序列化 JSON(和类似的),并启用数据类。
目前已经支持用 dart:fi 编译成 C 库的代码的互操作。正在努力将其扩展到支持 Android 上的 Java 和 Kotlin 互操作,以及 iOS/MacOS 上的 Objective C 和 Swift 互操作。
编译为 WebAssembly —— 使用 native code 定位 web
https://medium.com/dartlang/announcing-dart-3-53f065a10635
往期推荐
Safari险胜Edge,全球第二
微信扫码关注该文公众号作者