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

推荐语:

自从 Flutter Forword 发布了  Dart 3α 预览 之后,大家对 Dart 3 的正式发布就一直翘首以待,这不仅仅是 Dart 版本号追上了 Flutter 版本号,更是 Dart 在 2.0 之后迎来的最大一次更新。Dart 3将只支持健全的Null安全,这意味着以前没有健全的Null安全的运行方式将不再被支持。对于 Flutter 开发者来说,Flutter 3.10 和 Dart 3.0 可以说是新的分水岭,更多详细介绍可见下方正文。

——MobTech袤博科技基础技术平台iOS高级研发工程师   张无忌

 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 迁移指南:Dart 3 migration guide | Dart

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

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

使用记录构建结构化数据

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

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

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

更多详细信息可查看文档:Records | Dart

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

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

考虑模式的基本形式。以下记录模式将记录解构为两个新变量 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(Patterns | Dart) 和 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 使用者更改的风险。

更多详情可查看文档:Class modifiers | Dart

展望未来

  • 查看 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/21293.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c/c++ 宏定义里的#和##

工作中如果是c开发的话&#xff0c;经常会用到宏定义&#xff0c;而宏定义中的#和##也会时不时遇到&#xff0c;今天分享这两个符号的作用。 1&#xff0c;# -- 转换成字符串 直接看例子&#xff1a; #include <stdio.h> #include <stdlib.h>#define VAL2STR(VA…

肝一肝设计模式【八】-- 外观模式

系列文章目录 肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 肝一肝设计模式【三】-- 原型模式 传送门 肝一肝设计模式【四】-- 建造者模式 传送门 肝一肝设计模式【五】-- 适配器模式 传送门 肝一肝设计模式【六】-- 装饰器模式 传送门 肝…

mysqlbinlog delete恢复成insert

不小心把数据删掉了 首先要拿到binlog文件 执行以下命令行 /usr/local/mysql/bin/mysqlbinlog --base64-outputdecode-rows --start-datetime“2023-05-19 09:01:32” --stop-datetime“2023-05-19 09:01:35” -v /Users/zylong/Downloads/mysql-bin.003178 --result-file/Use…

蓝桥:前端开发笔面必刷题——Day1 数组(一)

文章目录 &#x1f4cb;前言&#x1f3af;数组中重复的数字&#x1f4da;题目内容✅解答 &#x1f3af;两数之和&#x1f4da;题目内容✅解答 &#x1f3af;替换空格&#x1f4da;题目内容✅解答 &#x1f3af;二维数组中的查找&#x1f4da;题目内容✅解答 &#x1f4dd;最后 …

C#串口通信从入门到精通(14)——多个串口接收数据

文章目录 前言1、多串口数据的接收2、源码前言 我们在开发串口通信程序时,有时候会需要连接不止一个串口,这时候该怎么写程序呢?本文就来介绍多个串口数据的接收 1、多串口数据的接收 我们在之前的专栏中介绍了串口数据的发送,当时有提到过,我们是通过创建一个SerialPo…

unity,如何让人物随着鼠标滑动而转向?

介绍 unity&#xff0c;如何让人物随着鼠标滑动而转向&#xff1f; 方法 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems;public class PlayerMovement : MonoBehaviour {public float speed 6f; …

RK3588平台开发系列讲解(进程篇)Linux文件系统数据结构

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、Linux 文件系统数据结构有哪些二、超级块结构 spuer_block三、目录 dentry四、文件索引结点 inode五、打开的文件 file沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将介绍 Linux 文件系统数据结构…

IIC总线通讯协议学习

​ IIC(最简单的总线通讯,简单意味着通用和普适性) iic通讯一般采用一主多从的方式.同一时间要么在发送信息,要么在读取信息(半双工通讯) ​​​​​​​​​​​​​​ ​​​​ ​​​ 标准的写数据帧&#xff08;主机向从机写数据) 解释以上的写数据帧 S:起始信号(在SCL…

什么是投入产出比(ROI)以及如何提升投入产出比?

投入产出比&#xff08;ROI&#xff09;是一种衡量企业或项目投资效益的指标&#xff0c;它可以帮助企业评估投资回报情况&#xff0c;并制定更加明智的投资决策。本文将为大家介绍什么是投入产出比&#xff08;ROI&#xff09;以及如何提升投入产出比。 一、什么是投入产出比&…

6年心得,从功能测试到测试开发,送给在测试路上一路走到黑的你

蓦然回首&#xff0c;软件测试风风雨雨的这就几年&#xff0c;起初每天的工作只是鼠标点点点&#xff0c;我还真不知道怎么办&#xff0c;闲的时候真的怀疑自己的存在价值&#xff0c;每天拿着7000的工资&#xff0c;飘荡在繁华的深圳&#xff0c;吃不饱也饿不死&#xff0c;未…

【UDS】诊断故障代码老化机制

文章目录 简介相关术语1. 老化计数器 Ageing counter2. 诊断故障代码已老去 DTC aged3. 已老去计数器 Aged counter4. 操作循环 Operation cycle5. 诊断故障代码老化机制 DTC aging mechanism 总结 ->返回总目录<- 简介 诊断故障代码&#xff08;DTC&#xff09;一旦生…

软件设计师考试笔记,已通过

目录 系统可靠度 外部实体 内聚类型 编译过程 逆波兰式 前驱图 scrum框架模型 编译和解释 有限自动机 聚簇索引和非聚簇索引 二叉树的前序,中序,后序遍历 动态规划贪心算法 算法 01背包问题 系统可靠度 1. 串联部件可靠度 串联部件想要这条路走通&#xff0c;只有…

062:cesium设置泛光折线材质(material-6)

第062个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置泛光折线材质,请参考源代码,了解PolylineGlowMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共89行)相关API参考:专…

开发框架Furion之WebApi+SqlSugar (一)

目录 1.开发环境 2.项目创建 2.1创建WebApi主项目 2.2 创建Start类库 2.3创建Model实体类库 2.4创建Application仓储业务类库 2.5创建Unility通用方法类库 3.基础功能配置 3.1 Model实体对象与数据表映射 3.2 基类仓储及动态Api接口配置 3.3 数据库IOC注册 3.4 Star…

JDK源码阅读环境搭建

本次针对jdk8u版本的搭建 1.新建项目 新建java项目JavaSourceLearn &#xff0c;这里我创建的是maven 2.获取JDK源码 打开Project Structure 找到本地JDK安装位置将src.zip解压到项目java包中 整理下项目结构&#xff0c;删除用不到的目录 提示: 添加源码到项目之后首次运行…

从零玩转设计模式之原型模式-yuanxingmoshi

title: 从零玩转设计模式之原型模式 date: 2022-12-11 20:05:35.488 updated: 2022-12-23 15:35:44.159 url: https://www.yby6.com/archives/yuanxingmoshi categories: - 设计模式 tags: - 设计模式 - 原型模式 什么是原型模式设计模式? 原型模式是一种软件设计模式&#…

公司招了一个00后,以为是个小年轻,没想到人家是个卷王...

公司前段缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资也不低&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。 令我印象最深的是一个00后测试员&#xff0c;…

【Linux高级 I/O(2)】如何使用阻塞 I/O 与非阻塞 I/O?——select()函数

上次我们虽然使用非阻塞式 I/O 解决了阻塞式 I/O 情况下并发读取文件所出现的问题&#xff0c;但依然不够完美&#xff0c;使得程序的 CPU 占用率特别高。解决这个问题&#xff0c;就要用到本文将要介绍的 I/O 多路复用方法。 何为 I/O 多路复用 I/O 多路复用&#xff08;IO m…

AI 将完全取代前端开发吗?

注&#xff1a;今晨&#xff0c;我浏览 Medium&#xff0c;看到了篇颇为标题党的文章&#xff0c;于是我就将它抛给了 ChatGPT。本篇文章全部由 ChatGPT 所写。同时&#xff0c;我也请 ChatGPT 分享了它对此的观点。 最近&#xff0c;我的同事向我讲述了他与他老板的一次谈话。…

Python机器学习:Scikit-learn和TensorFlow的应用和模型设计

一、引言 Python在机器学习领域中已经成为非常受欢迎的编程语言。Scikit-learn和TensorFlow是Python中应用最广泛的两个机器学习库&#xff0c;它们提供了丰富的机器学习算法和工具&#xff0c;帮助开发人员轻松地构建和训练机器学习模型。本文将详细介绍Scikit-learn和Tensor…