[译] Dart 3 公布了
原文 https://medium.com/dartlang/announcing-dart-3-53f065a10635
https://ducafecat.com/blog/dart-3
来自 Google I/O 2023 的问候。明天,咱们在 Mountain View 现场发表 Dart 3——迄今为止最大的 Dart 公布!Dart 3 蕴含三个次要停顿。首先,咱们实现了通往 100% 无空平安的旅程。其次,咱们为记录、模式和类修饰符增加了重大的新语言个性。第三,咱们预览了将来,通过 Wasm 编译,咱们将扩充咱们的平台反对,为 web 提供本地代码反对。当初,让咱们进入细节。
100% 无空平安
在过来的四年里,咱们将 Dart 倒退成了一种疾速、便携、现代化的语言。当初,通过 Dart 3,它是一种 100% 无空平安的语言!正如咱们之前所探讨的,咱们认为没有其余编程语言已经为现有语言增加过无空平安。所以,这是一个相当漫长的旅程。
在 Dart 中实现了 100% 的 null 平安之后,咱们领有了 sound 类型零碎。您能够信赖,如果一个类型说一个值不是 null
,那么它永远不会是 null
。这防止了某些类别的编程谬误,如空指针异样。它还容许咱们的编译器和运行时以不可能没有空平安的形式优化代码。这个设计抉择波及到一个折衷。尽管迁徙变得有点艰难,但咱们认为咱们为 Dart 做出了正确的抉择。
迁徙到 Dart 3
实现 sound null safety 的一个要害局部是 Dart 社区的不懈反对:pub.dev 的前 1000 个包中有 99% 反对 null safety!
鉴于此,咱们预计曾经迁徙到 null safety 的绝大多数包和应用程序将与 Dart 3 兼容。只有在多数状况下,Dart 3 中的一些相干清理可能会影响一些代码。一些旧的外围库 API 曾经被删除(#34233, #49529),一些工具曾经进行了调整(#50707)。如果您在应用 Dart 3 SDK 迁徙时遇到任何问题,请参阅 Dart 3 迁徙指南。除此之外,咱们心愿您会喜爱新的理性化外围库和工具。
次要语言个性——记录、模式和类修饰符
Dart 3 不仅是扭转现有语言的问题。它还增加了重要的新性能和能力!这些包含记录、模式和类修饰符。
应用记录构建结构化数据
传统上,Dart 函数只能返回单个值。因而须要返回多个值的函数必须将它们打包到其余数据类型中,例如映射或列表,或定义能够保留值的新类。应用未打印的数据结构会减弱类型安全性。必须定义新类以仅仅携带数据会在编码过程中减少摩擦。您曾经十分分明地通知了咱们:多返回值的语言申请是咱们的 第四高评级问题。
应用记录,您能够应用丑陋而简洁的语法构建结构化数据。思考这个函数。它读取 JSON 块的名称和年龄,并将它们都以记录模式返回:
(String, int) userInfo(Map<String, dynamic> json) {return (json['name'] as String, json['height'] as int);
}
这应该很相熟所有的 Dart 开发人员。记录看起来像列表文字,例如 [‘Michael’,‘Product Manager’]
,但应用括号而不是方括号。在 Dart 中,记录是一个通用个性。它们能够用于超过函数返回值的用处。您还能够将它们存储在变量中,将它们放入列表中,在映射中应用它们作为键,或创立蕴含其余记录的记录。您能够增加未命名字段,就像咱们在先前的示例中所做的那样,也能够增加命名字段,如 (42, description:‘Meaning of life’)
。
记录是值类型,没有身份。这使得编译器在某些状况下能够齐全擦除记录对象。记录还带有主动定义的 ==
运算符和 hashCode
函数。记录文档中有更多细节。
应用模式和模式匹配解决结构化数据
记录简化了构建结构化数据的形式。这并不取代应用类构建更正式的类型层次结构。它只是提供了另一种抉择。在任何状况下,您可能须要将该结构化数据合成为其各个元素以解决它们。这就是模式匹配发挥作用的中央。
思考模式的根本模式。以下记录模式将记录合成为两个新变量 name
和 height
。而后,这些变量能够像任何其余变量一样应用,例如在调用 print
中:
var (String name, int height) = userInfo({'name': 'Michael', 'height': 180});
print('User $name is $height cm tall.');
相似的模式存在于列表和映射中。对于所有这些,您能够应用下划线模式跳过单个元素:
var (String name, _) = userInfo(…);
当在 switch 语句中应用时,模式会发挥作用。Dart 从一开始就具备无限的 switch 反对。在 Dart 3 中,咱们扩大了 switch
语句的性能和表达力。咱们当初反对在这些状况下进行模式匹配。咱们曾经删除了在每个 case 结尾增加 break
的须要。咱们还反对逻辑运算符来组合 case。以下示例显示了一个丑陋而简洁的 switch
语句,该语句解析字符代码:
switch (charCode) {
case slash when nextCharCode == slash:
skipComment();
case slash || star || plus || minus:
operator(charCode);
case >= digit0 && <= digit9:
number();
default:
invalid();}
当须要每个 case
中有一个或多个语句时,switch
语句提供了很好的帮忙。在某些状况下,您只须要计算一个值。对于这种用例,咱们提供了一个十分简洁的 switch expression。这相似于 switch statement,但应用不同的语法,这些语法被调整为表达式。以下示例函数返回 switch 表达式的值,以计算明天的工作日形容:
String describeDate(DateTime dt) =>
switch (dt.weekday) {
1 => 'Feeling the Monday blues?',
6 || 7 => 'Enjoy the weekend!',
_ => 'Hang in there.'
};
模式的一个弱小性能是查看“穷尽性”,该性能确保 switch 解决所有可能的状况。在上一个示例中,咱们解决了 weekday 的所有可能值,它是一个 int
。通过为特定值 1
、6
或 7
的匹配语句组合,而后应用默认状况 _
解决残余的状况,咱们穷尽了所有可能的值。为了对用户定义的数据层次结构(例如,类层次结构)启用此查看,请在类层次结构的顶部应用新的 sealed
修饰符,如以下示例:
sealed class Animal {…}
class Cow extends Animal {…}
class Sheep extends Animal {…}
class Pig extends Animal {…}
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
语句也能够应用模式。在下一个示例中,咱们应用 if-case 匹配来匹配一个 map-pattern 来解构 JSON 映射。在其中,咱们针对常量值(如 'name'
和 'Michael'
)和类型测试模式 int h
进行匹配以读取 JSON 值。如果模式匹配失败,Dart 将执行 else
语句。
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!');
}
这只波及到您能够应用模式的所有内容。咱们置信它们将在所有 Dart 代码中变得广泛。要理解更多,请查看 模式文档 和 模式 codelab。
类修饰符为类提供细粒度的访问控制
Dart 3 的第三个语言个性是类修饰符。与咱们冀望每个 Dart 开发人员都应用的记录和模式不同,这更像是一个高级用户性能。它解决了 Dart 开发人员构建大型 API 外表或构建企业级应用程序的需要。
类修饰符使 API 作者可能仅反对特定的功能集。默认值放弃不变。咱们心愿 Dart 放弃简略和易于靠近。因而,像以前一样,惯例类能够 结构 、 扩大 和 实现,如以下示例所示:
class Vehicle {
String make; String model;
void moveForward(int meters) {…}
}
// Construct.
var myCar = Vehicle(make: 'Ford', model: 'T',);
// Extend.
class Car extends Vehicle {int passengers;}
// Implement.
class MockVehicle implements Vehicle {@override void moveForward …}
类修饰符反对增加限度。思考一些示例用例:
- 应用
interface class
,您能够定义其他人要实现的协定。接口类无奈扩大。 - 应用
base class
,您能够确保您的所有类的子类型都从它继承,而不是实现其接口。这确保了所有实例上都能够应用公有办法。 - 应用
final class
,您能够敞开类型层次结构,避免在您本人的库之外创立任何子类。作为示例的益处是,这容许 API 拥有者增加新成员而不会冒着毁坏 API 消费者的危险。
无关详细信息,请参见新的 class modifiers documentation。
展望未来
Dart 3 不仅是一个新性能的重要提高,咱们还为您提供了将来的预览。
Dart 语言
记录、模式和类修饰符是十分重要的新性能,因而它们的设计可能仍有改良之处。咱们将持续监控您的反馈意见,如果须要,在 Dart 3 后的小版本中进行更新。
咱们还在钻研一些更小、更增量的性能,这些性能齐全不会毁坏任何代码,并且专一于进步开发者的生产力。咱们正在摸索的两个例子是内联类,用于应用零老本“包装器”封装现有类型,以及主构造函数; 这是一项性能,它引入了一个更简洁的语法,用于定义具备大量字段和主构造函数的类。
咱们之前探讨过宏(也称为元编程)。咱们特地关注此性能,以实现更好的 JSON 反序列化(及相似操作),以及实现数据类。鉴于元编程的规模和固有危险,咱们采取了十分彻底的办法,因而没有具体时间表可分享,甚至无奈最终确定设计决策。
原生互操作
挪动设施和桌面应用程序通常依赖于由本地平台提供的许多 API,无论是告诉、领取还是获取手机地位。传统上,在 Flutter 中通过构建插件来拜访这些 API,这须要编写 Dart 代码和一堆特定于平台的代码来提供实现。
咱们曾经反对应用 [dart:ffi](<https://dart.dev/guides/libraries/c-interop>)
编译为 C 库的代码进行互操作。咱们目前正在扩大此性能,以反对在 Android 上的 Java 和 Kotlin 互操作,以及在 iOS/macOS 上的 Objective C 和 Swift 互操作。要理解 Android 互操作的介绍,请查看 Google I/O 23 的新 Android 互操作视频。
编译为 WebAssembly —— 应用本机代码定向 Web
WebAssembly(缩写为 Wasm)作为跨古代浏览器的平台中立二进制指令格局而一直成熟。Flutter 框架曾经应用 Wasm 一段时间了。这是咱们通过一个 Wasm 编译模块将用 C++ 编写的 SKIA 图形渲染引擎传递到浏览器中的形式。咱们长期以来始终有趣味将 Wasm 用于部署 Dart 代码,但咱们始终碰壁。像许多其余面向对象语言一样,Dart 应用垃圾回收。在过来的一年里,咱们与 Wasm 生态系统中的几个团队单干,为 WebAssembly 规范增加了一个新的 WasmGC 性能。这在 Chromium 和 Firefox 浏览器中曾经靠近稳固。
咱们将 Dart 编译为 Wasm 模块的工作对于 Web 应用程序有两个高层次的指标:
- 加载工夫:咱们心愿能够通过 Wasm 提供部署负载,使浏览器可能更快地加载,从而进步用户与 Web 应用程序交互所需的工夫。
- 性能:由 JavaScript 驱动的 Web 应用程序须要即时编译能力实现良好的性能。Wasm 模块更靠近底层和机器代码,因而咱们认为它们能够提供更高的性能,缩小卡顿并提供更统一的帧速率。
- 语义一致性:Dart 骄傲地示意在咱们反对的平台之间高度一致。然而,在 Web 上,这还存在一些例外情况。例如,Dart Web 以后在数字的示意形式上有所不同。应用 Wasm 模块,咱们将可能将 Web 视为相似其余本机指标的平台,其语义相似。
咱们很快乐地发表 Dart 到 Wasm 编译的第一个预览版!咱们最后的重点是 Flutter Web 反对。当初还处于晚期阶段,咱们还有很多工作要实现,但咱们邀请您进行试验,看看这是否和咱们一样令人兴奋。
结束语
感谢您浏览到最初。咱们心愿这篇文章让您对 Dart 3 感到兴奋,它明天在独立的 Dart SDK 和 Flutter 3.10 SDK 中都能够应用。
咱们通过声音的空值平安、外围库和工具清理实现了 Dart 语言的重大革新。有重大的新语言性能,使 Dart 更具表现力和清晰度,领有记录和模式。对于大型 API 外表,类修饰符能够实现具体的管制。咱们还包含了将来的预览,即咱们行将反对 WebAssembly。
凭借所有这些性能,咱们认为 Dart 3 展现了咱们的长期愿景:建设最具生产力的编程语言,用于在任何平台上构建疾速应用程序。咱们心愿您也这样认为!
© 猫哥
ducafecat.com
end
本文由 mdnice 多平台公布