Dart 2.7 发布了,此版本添加了对扩展方法的支持,并带来一个用于处理带有特殊字符的字符串的新程序包。DartPad 中 null 的安全性也得到了更新。
扩展方法
Dart 2.7 添加了一个强大的语言新功能:扩展方法(extension methods)。它使你可以向任何类型(甚至是无法控制的类型)添加新功能,并具有常规方法调用的简洁性和自动完成性。
让我们看一个小例子:增加对从字符串解析整数和双精度的支持。作为应用开发人员,我们无法更改 String 类,因为它是在 dart:core 库中定义的,但是通过扩展方法,我们可以对其进行扩展。定义此扩展名后,我们可以在 String 上调用新的 parseInt 方法,就好像该方法是在 String 类本身上定义的一样:
extension ParseNumbers on String {
int parseInt() {
return int.parse(this);
} double parseDouble() {
return double.parse(this);
}
}main() {
int i = '42'.parseInt();
print(i);
}
- 扩展方法是静态的
- 扩展可以具有类型变量
- 扩展方法实际上是扩展成员
关于扩展方法的内容太多,此处不做详述,详情参见更新说明。
安全子字符串处理
Dart 的标准 String 类使用 UTF-16 编码。这是编程语言中的常见选择,尤其是那些支持在设备和 Web 上本机运行的语言。
UTF-16 字符串通常可以很好地工作。但是,在处理字符串时,尤其是在处理用户输入的字符串时,可能会遇到用户理解为字符的字符与 UTF-16 中编码为代码单元的字符之间的差异。让我们看一个小例子,提取用户输入的字符串的前三个字符:
var input = [‘Resume’];
input.forEach((s) => print(s.substring(0, 3)));$ dart main.dart
Res
到目前为止没有问题;我们在输入列表中打印了字符串的前三个字符,结果为 Res。现在,我们考虑来自不同地区的用户,他们可能会输入包含重音符号,韩语(韩语脚本)甚至是表情符号组合的字符串来代表“恢复”概念:
对于 Re′sumé,为什么我们得到一个“两个字符”的字符串?对于那两个 emoji,奇怪的问号是怎么回事?这里的问题出在 Unicode。实际上,Résume 中的重音符号 e 是两个代码点:e 和组合的重音符号。
就像之前说过的,通常不需要担心字符和代码点。如果你要做的只是接收、传递并移交整个字符串,则内部编码是清晰可见的。但是,如果需要遍历字符串的字符或操纵字符串的内容,就可能会遇到麻烦。
Dart 2.7 引入了一个新的字符包,用于处理这些情况。此程序包支持将字符串视为用户感知的字符序列,也称为 Unicode 字形簇。使用字符包,可以通过对缩短文本的代码进行少量更改来修复代码:
// Before:
input.forEach((s) => print(s.substring(0, 3)));// After, using the characters package:
input.forEach((s) => print(s.characters.take(3)));
首先,我们从 s 中的字符串创建一个新的 Characters 实例(使用方便的 .characters 扩展方法)。然后使用 take() 方法提取前三个字符即可。
新版本还带来了 Null 安全性预览。
更多详细信息,参见:
https://medium.com/dartlang/dart-2-7-a3710ec54e97
转自 https://www.oschina.net/news/112035/dart-2-7-released