Dart 2.7 发布,新增扩展方法支持

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

猜你喜欢

转载自www.oschina.net/news/112035/dart-2-7-released
2.7