Dart 3 正式发布,100% 健全的空安全


Dart 3 现已发布,这是迄今为止最大的 Dart 版本,包含了三个主要改进:完成了 100% 健全的空安全;添加了记录、模式和类修饰符的新语言特性;以及对未来进行了预览,即,通过 Wasm 编译扩大了对网络原生代码的平台支持。

100% 健全的空安全

Dart 3 已经成为了一种 100% 健全的空安全语言。100% 的空安全性为 Dart 带来了健全的类型系统。你可以相信,如果一个类型说一个值不是null,那么它永远不可能是null。这避免了某些类别的编码错误,例如空指针异常。它还允许编译器和运行时以没有空安全性无法实现的方式优化代码。虽然这种设计会使得迁移变得有点困难,但开发团队认为,他们为 Dart 做出了正确的选择。

预计绝大多数已迁移到 null safety 的包和应用程序都可以与 Dart 3 一起使用。在少数情况下,Dart 3 中的少量相关清理可能会影响某些代码。一些旧的核心库 API 已被删除(#34233、#49529)并且一些工具已被调整(#50707)。如果用户在迁移到使用 Dart 3 SDK 时遇到任何问题,可查阅 Dart 3 迁移指南。

主要语言特性 —— 记录、模式和类修饰符

Dart 3 不仅仅是基于现有基础作出改变,它还涉及添加重要的新特性和功能。

使用记录构建结构化数据

借助记录,你可以使用简洁明了的语法构建结构化数据。

( String , int ) userInfo( Map < String , dynamic > json) { return (json[ 'name' ] as  String , json[ 'height' ] as  int ); }

记录是值类型,没有标识。这使得编译器能够在某些情况下完全擦除记录对象。记录还带有自动定义的==运算符和hashCode函数。更多详细信息可查看文档。

用模式和模式匹配来处理结构化数据

记录简化了构建结构化数据的方式。这不会取代使用类来构建更正式的类型层次结构。它只是提供了另一种选择。在任何一种情况下,你都可能希望将该结构化数据分解为单独的元素以使用它们。这就是模式匹配发挥作用的地方。

考虑模式的基本形式。以下记录模式将记录解构为两个新变量nameheight。然后可以像任何其他变量一样使用这些变量,例如调用print时:

var (String name, int height) = userInfo({'name': 'Michael', 'height': 180});
print('User $name is $height cm tall.');

类似的模式也存在于 lists 和 maps 中。对于所有这些,你可以使用下划线模式跳过单个元素:

var (String name, _) = userInfo(…);

Dart 3 中还扩展了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 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语句也可以使用模式:

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!');
}

更多详情可查看 patterns documentation  patterns 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,你可以关闭类型层次结构以防止你自己的库之外的任何子类。作为一个 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

更多详情可查看官方公告。


相關推薦

2022-12-10

持续一段时间的影响/阵痛期,开发者最好是可以在 Dart 3 发布之前调整他们的代码。Google 也已经发布了迁移工具,开发者也能够相对轻松地完成迁移工作。 在 Dart 3 发布后,该语言的下一个重要里程碑可能是支持将 Dart 代码编

2022-04-02

件工程师、中小学生、数据分析师这... OpenHarmony 3.1 已正式发布。 当前版本在 OpenHarmony 3.1 Beta 的基础上,更新支持以下能力: 标准系统基础能力增强 本地基础音视频播放能力、视频硬编解码、相机基础预览、拍摄能力。 Rende

2024-07-23

新华社受权发布《中共中央关于进一步全面深化改革推进中国式现代化的决定》,其中提到要健全网络综合治理体系,深化网络管理体制改革,整合网络内容建设和管理职能,推进新闻宣传和网络舆论一体化管理。 完善生成式

2024-04-19

键软件、智能终端等重点产品和装备智能化水平。 三是健全完善支撑体系,培育壮大产业生态。加强标准引领,建立健全人工智能赋能新型工业化标准体系,优化布局人工智能领域制造业创新中心、产业技术基础公共服务平台

2023-05-07

Serverpod 是一个新一代的应用程序和 Web 服务器,专为 Flutter 和 Dart 生态构建。它允许你用 Dart 编写你的服务器端代码,自动生成你的 API,Serverpod 是开源的,可以在任何地方托管你的服务器。 Serverpod 1.1 版本使 Serverpod 更易

2022-05-12

Flutter 完全原生于 Apple 芯片上进行开发。虽然 Flutter 自发布以来一直与基于 M1 的 Apple 设备兼容,但 Flutter 现在充分利用了 Dart 对  Apple 芯片的支持,从而能够在基于 M1 的设备上更快地编译并支持 macOS 应用程序的通用二进制文

2023-06-22

Hugo 是一个用 Go 语言编写的静态 HTML 和 CSS 网站生成器。它针对速度、易用性和可配置性进行了优化。Hugo 将一个带有内容和模板的目录,渲染成一个完整的 HTML 网站。 这个版本的主要内容是现在支持 Dart Sass Embedded 协议的两个

2022-09-01

Flutter 3.3 现已发布,此版本专注于完善和性能改进,以强化三个月前发布的 Flutter 3 中所提供的功能。自 Flutter 3 发布以来,Flutter 已经合并了 5,687 个 PR。此版本通过几个新组件和一些错误修复扩展了对不断发展的 Material 3 规范

2023-05-10

它成为有史以来第一个具有工业强度的通用操作系统,并正式证明了实现的正确性。在随后的几年中,该团队进一步补充证明了 seL4 强制执行完整性和机密性的核心安全属性,将证明扩展到内核的二进制代码,并对一个 protected m

2022-11-23

Oracle Linux 8.7 上周正式发布了 GA 版本,支持 64 位英特尔、AMD (x86_64),以及 64 位 Arm (aarch64) 架构平台。与所有的 Oracle Linux 版本一样,此版本与相应 RHEL 版本 100% 应用二进制兼容。 对于 64 位英特尔和 AMD 架构,Oracle Linux 提供了

2023-11-30

产品发布暨用户大会上,龙芯 3A6000 国产桌面通用处理器正式发布。 此处引用一下央视新闻的报道原文: 龙芯3A6000采用我国自主设计的指令系统和架构,无需依赖任何国外授权技术,是我国自主研发、自主可控的新一代

2024-05-11

PHP 8.3.7 现已发布,这是一个错误修复版本。具体更新内容包括: Core: 修复了错误GH-13772(启用 JIT 时 observer fcall handlers 中的execute_data->opline 指针无效)。 修复了错误GH-13931(将 zero offset 应用于 Zend/zend_opcode.c 中的空

2023-12-19

社区小伙伴们,Apache Doris 2.0.3 版本已于 2023 年 12 月 14 日正式发布,该版本对复杂数据类型、统计信息收集、倒排索引、数据湖分析、分布式副本管理等多个功能进行了优化,欢迎大家下载体验。 此外,由衷感谢 104 位贡献者

2022-01-12

网络安全公司 Check Point Research 最新发布的一份 2021 年调查报告指出,从 2020 年中期到 2021 年,网络攻击的数量呈上升趋势。这一趋势在 2021 年年底达到了历史最高水平,在全球范围内达到每个组织每周遭受 925 次网络攻击的峰