Redian新闻
>
Dart 3正式发布:100%健全的空值安全、迄今为止最大版本

Dart 3正式发布:100%健全的空值安全、迄今为止最大版本

公众号新闻

出品 | OSC开源社区(ID:oschina2013)

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

100% 健全的空值安全

Dart 3 已经成为了一种 100% 健全的空值安全语言。
100% 的空值安全性为 Dart 带来了健全的类型系统。你可以相信,如果一个类型说一个值不是 null,那么它永远不可能是 null。这避免了某些类别的编码错误,例如空指针异常。它还允许编译器和运行时以没有空安全性无法实现的方式优化代码。虽然这种设计会使得迁移变得有点困难,但开发团队认为,他们为 Dart 做出了正确的选择。
空值引用可以追溯到 1964 年左右,当时英国计算机科学家 Tony Hoare 在 ALGOL 语言中引入了这个概念。但他自己却把空值引用称为自己的十亿美元错误,因为它导致了数不清的错误、漏洞和系统崩溃,可能在之后 40 年中造成了十亿美元的损失。
预计绝大多数已迁移到 null safety 的包和应用程序都可以与 Dart 3 一起使用。在少数情况下,Dart 3 中的少量相关清理可能会影响某些代码。一些旧的核心库 API 已被删除(#34233、#49529)并且一些工具已被调整(#50707)。
如果用户在迁移到使用 Dart 3 SDK 时遇到任何问题,可查阅 Dart 3 迁移指南:https://dart.dev/resources/dart-3-migration

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

Dart 3 不仅仅是基于现有基础作出改变,它还涉及添加重要的新特性和功能。
使用记录构建结构化数据
借助记录,你可以使用简洁明了的语法构建结构化数据。
( String , int ) userInfo( Map < String , dynamic > json) { return (json[ 'name' ] as  String , json[ 'height' ] as  int ); }
记录是值类型,没有标识。这使得编译器能够在某些情况下完全擦除记录对象。记录还带有自动定义的 == 运算符和 hashCode 函数。
更多详细信息可查看文档:https://dart.dev/language/records
用模式和模式匹配来处理结构化数据
记录简化了构建结构化数据的方式。这不会取代使用类来构建更正式的类型层次结构。它只是提供了另一种选择。在任何一种情况下,你都可能希望将该结构化数据分解为单独的元素以使用它们。这就是模式匹配发挥作用的地方。
考虑模式的基本形式。以下记录模式将记录解构为两个新变量 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(…);
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 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!');
}
更多详情可查看 patterns documentation(http://dart.dev/language/patterns  patterns codelab(https://codelabs.developers.google.com/codelabs/dart-patterns-records)。

具有类修饰符的类的细粒度访问控制

Dart 3 的第三个语言特性是类修饰符。与期望每个 Dart 开发人员都使用的记录和模式不同,这更像是一个高级用户功能。它满足了 Dart 开发人员制作大型 API 表面或构建企业级应用程序的需求。
类修饰符使 API 作者能够仅支持一组特定的功能。默认值保持不变。开发团队希望 Dart 保持简单易用。因此,像以前一样,可以构造、扩展和实现常规类,如以下示例所示:
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 使用者更改的风险。

更多详情可查看文档:https://dart.dev/language/class-modifiers

展望未来

  • 查看 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,全球第二
前端框架Svelte放弃TypeScript,JS赢!

首个中文医学知识LLM:真正的赛华佗—华驼(HuaTuo)



🌟 活动推荐

2023 年 5 月 27-28 日,GOTC 2023 全球开源技术峰会将在上海张江科学会堂隆重举行。
为期 2 天的开源行业盛会,将以行业展览、主题发言、特别论坛、分论坛、快闪演讲的形式来诠释此次大会主题 ——“Open Source, Into the Future”。与会者将一起探讨元宇宙、3D 与游戏、eBPF、Web3.0、区块链等热门技术主题,以及 OSPO、汽车软件、AIGC、开源教育培训、云原生等热门话题,探讨开源未来,助力开源发展。
长按识别下方二维码立即查看 GOTC 2023 详情/报名。

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
最新一季《锵锵行天下》 - 西湖真美。我发小就一直生活在西湖畔,羡慕死我了。说好退休后去她那儿歇一段日子喜报|泽维生物完成千万元天使轮融资、迄今最详细的大脑发育基因图揭示五种疾病根源华仪宁创:突破直接电离质谱技术,开发精准医疗、食品安全、公共安全多场景质谱仪Nat Commun | 科学家绘制出了迄今为止最深入的健康肠道菌群从母体转移到婴儿体内的图谱宾州新希望小城(New Hope),秋景名片冒雨观看圣帕特里克节游行(多图)恭喜!刚刚正式发布:中小学近视的学生有救了,不手术、见效快!!Debian 12 发布,迄今为止最佳 Linux 版本瑞士 Verbier 100 战况ROG Matrix RTX 4090 详解,可提供华硕迄今为止最强性能7 Papers & Radios | 一句话为视频加特效;迄今为止最全昆虫大脑图谱大批硬件新品将至!苹果WWDC 2023正式官宣,首款VR头显终于要来了...深度 deepin 操作系统 20.9 正式发布:Qt 版本升级至 5.15.8恭喜!刚刚正式发布:中小学生视力防控恢复方法来啦,不手术、见效快!!【广发策略】OpenAI正式发布ChatGPT App版本(5月第3期)有人最近回国用过$100 美金一个月的Verizon 国际plan 么迄今为止规模最大,至少17国超2700杀猪盘工人菲律宾获救,包括600余中国人迄今为止,预测美国经济在2023年衰退的人都错了又一款可以玩的乐高游戏机!乐高集团正式发布吃豆人43周年纪念套装:10232 吃豆人街机亿万富翁怒砸$100,000 要求飞机邻座妹子摘口罩!她最终摘了下来,他却更气……Vite 4.3正式发布,性能提升,为应对Rust写的Turbopack?华盛顿州0.58%的长期护理税从7/1/2023正式开始征收!新东方《2023中国留学白皮书》正式发布:17岁以下、25岁以上意向留学人群上升!太突然!最大融资发生:1000000000元举报、告密与反告密[日签]​ 健全的思想寓于健全的人格苏纳克将重启Help-to-Buy助力年轻人买房!英国护士举行迄今为止规模最大的罢工!微星推出泰坦 GP78HX 游戏本:i9-13980HX+RTX4090 版本 24999元、RTX4060版本 11299元首发天玑8020芯片,荣耀平板V8正式发布:1799元起突发!终于降了!但关于澳洲,这是迄今为止最悲观的预测!渔歌子(2):三月蝉鸣初入林Smart精灵 3正式官宣!尺寸更大、造型更动感,超长续航仅20.99 万元起《铃芽之旅》突破3.5亿 新海诚迄今为止最好的作品 | 9.9元抢980元电影卡郭德纲&于谦2023相声悉尼站,加场! 6月23正式开票,秒速爆抢!【VB100】2023年未来医疗100强榜单正式发布,聆听领袖企业的商业洞见人大发表迄今为止最大最全的大模型综述打工人狂喜!微信 PC 版 3.9.5 正式发布:锁定功能上线学会自私——是我至今为止做的最对的决定
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。