4

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

 1 year ago
source link: https://www.techug.com/post/dart-3-officially-released-100-robust-null-value-security-largest-version-to-datedb6771abf0e56afbdf62/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

TB2aCJ.lcbI8KJjy1zdXXbe1VXa_!!2768491700.jpg_640x640q80_.webp

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

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

dart-3-officially-released-100-robust-null-value-security-largest-version-to-datedb6771abf0e56afbdf62.01.png

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

本文文字及图片出自 OSC开源社区

O1CN013bCLqL1OQdsgcvnJK_!!2768491700.jpg_640x640q80_.webp

Recommend

  • 61

    从R星的GTA开始,开放世界塑造了新的游戏业界格局,自身也经历了许多进步和进化。世界地图的尺寸就是最直接的成长表现,而且在越来越大的开放世界里,也有越来越多的场景细节和玩家互动内容,为玩家带来了无尽的自由空间。相信许多玩家都曾问过同一个问题:目前究...

  • 25

    乍一看, 提案#2145 似乎是 C# 8 可空引用类型特性的逻辑扩展。其基本思想是,开发人员不需要再显式地向接受非空参数的方法添加参数空值检查。然而,人们对于这个特性的...

  • 9
    • blog.callmewhy.com 3 years ago
    • Cache

    入参空值校验的原因与方法

    入参空值校验的原因与方法 2020-06-10 7 min read

  • 6

    这个系列以练习为主,可能不会有多少讲述(当然本篇例外),可以作为初学者的自学验收之用。 Java 中有非受限的空值,并且不知哪时会引发 NPE(即 NullPointerException ),解决这个问题对于 Android 开发来说很简...

  • 2
    • www.lujun9972.win 3 years ago
    • Cache

    read读取到空值之迷

    read读取到空值之迷 今天犯了一个很想当然的错误。 在对银联前置系统做自动发布改造的时候,遇到一个脚本,类似于下面这样的菜单操作: while : do cat<<EOF 1) 登出 2) 登录 3) 停止应用 4) 启动应用 EOF re...

  • 4
    • studygolang.com 3 years ago
    • Cache

    Web 序列化空值处理

    Web 序列化空值处理 2637309949 · 大约16小时之前 · 82 次点击 · 预计阅读时间 22 分钟 ·...

  • 3
    • segmentfault.com 3 years ago
    • Cache

    ES11中的空值合并运算符

    ES11中的空值合并运算符发布于 今天 14:25 小编在自己的朋友圈和一些论坛中,都有看到一些前端或者后端被js中判断折磨到起飞,特别是针对空字符串和数字0,在js中,...

  • 2

    DHL又订购9架波音改装货机!迄今为止最大单笔订单! ...

  • 5

    迄今为止最大、性能最好的AI模型——Code Llama 70B 浙江土鸡蛋 责任编辑:wangyifei 发布于:2024-01-30 11:00 PConline原创

  • 1

    迄今为止最大的数据泄露罚款、处罚和和解 作者:Shweta Sharma 2024-04-29 07:01:00 安全 因非法将个人数据从欧盟转移到美国,Meta...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK