Dart 编程语言教程 - 第三章:记录(Records)

Dart 在 3.0 版本中引入了一种新的数据类型:记录(Records)。记录是一种轻量级的数据结构,类似于元组(tuple),用于存储一组相关但没有明确类结构的数据。它提供了一种方便的方式在不需要创建类的情况下,将多个值组合在一起。

记录与其他集合类型(如 ListSetMap)不同,它允许开发者在编译时直接使用固定数量和类型的值,并且每个值可以通过名称或位置访问。

1. 记录的基本语法

在 Dart 中,记录使用圆括号 () 进行声明,内部可以包含多个值,类似于元组。记录的字段可以是 位置字段命名字段,位置字段按顺序存储,而命名字段则可以通过名字访问。

1.1 位置字段记录

位置字段记录类似于一个固定长度的数组,通过位置(索引)访问每个元素。

void main() {
  var record = (1, 'Dart', true);
  print(record);        // 输出:(1, Dart, true)
  
  // 访问位置字段
  print(record.$1);     // 输出:1
  print(record.$2);     // 输出:Dart
  print(record.$3);     // 输出:true
}

在这个示例中,record 是一个包含三个字段的记录,字段可以通过 $1$2$3 来访问。索引从 $1 开始。

1.2 命名字段记录

命名字段记录允许为每个字段提供一个名称,从而提高代码的可读性。

void main() {
  var person = (name: 'Alice', age: 30, isStudent: false);
  
  // 访问命名字段
  print(person.name);        // 输出:Alice
  print(person.age);         // 输出:30
  print(person.isStudent);   // 输出:false
}

在此示例中,person 记录的每个字段都有一个明确的名称,允许通过字段名称来访问值。

1.3 混合位置字段和命名字段

记录还支持位置字段和命名字段的混合使用。你可以同时定义位置字段和命名字段。

void main() {
  var mixedRecord = (1, 'Dart', isCool: true);
  
  // 访问位置字段
  print(mixedRecord.$1);     // 输出:1
  print(mixedRecord.$2);     // 输出:Dart
  
  // 访问命名字段
  print(mixedRecord.isCool); // 输出:true
}
2. 记录的类型推断与声明

Dart 可以自动推断记录的类型,或者你也可以显式声明记录的类型。对于位置字段,使用括号括住字段的类型;对于命名字段,使用大括号括住字段名称和类型。

void main() {
  // 类型推断
  var record = (1, 'Dart');
  
  // 显式声明记录类型
  (int, String) typedRecord = (1, 'Dart');
  
  // 显式声明带命名字段的记录类型
  ({int age, String name}) person = (age: 30, name: 'Alice');
  
  print(record);         // 输出:(1, Dart)
  print(typedRecord);    // 输出:(1, Dart)
  print(person);         // 输出:(age: 30, name: Alice)
}
3. 记录的解构

Dart 支持记录的解构,可以将记录中的字段解构为单独的变量。

void main() {
  var (id, name, isActive) = (1, 'Dart', true);
  
  print(id);         // 输出:1
  print(name);       // 输出:Dart
  print(isActive);   // 输出:true
}

解构使得我们可以直接从记录中提取值并赋给单独的变量,增强了代码的简洁性。

4. 记录的比较

记录支持值比较(而不是引用比较)。即两个包含相同值的记录被认为是相等的,即使它们不是同一个实例。

void main() {
  var record1 = (1, 'Dart');
  var record2 = (1, 'Dart');
  
  print(record1 == record2); // 输出:true
}
5. 记录的用途
  • 临时数据结构:记录适合用来临时存储一组相关的数据,而无需定义一个类。
  • 函数返回值:记录可以用来作为函数的返回值,特别是在需要返回多个值时。
  • 减少代码冗余:使用记录可以减少代码中不必要的类定义,简化代码逻辑。
6. 记录的限制
  • 不可变:记录中的字段是不可变的,一旦创建不能修改。如果需要修改某个字段的值,需要创建一个新的记录。
  • 没有方法或属性:记录仅仅是用于存储数据的结构,不能像类一样包含方法或其他复杂的逻辑。
7. 记录与类的对比

记录与 Dart 的类非常相似,但它们有一些重要的区别:

特性记录 (Records)类 (Classes)
定义结构简单的值集合,轻量级包含字段、方法、继承、混入等复杂特性
可变性不可变可以是可变的或不可变的
使用场景临时数据结构、函数返回值等简单场景复杂的数据结构或具有行为的对象
定义字段使用位置或命名字段使用类中的字段
扩展能力不能继承或扩展支持继承、扩展和实现接口

总结

Dart 记录(Records)是一种轻量级的数据结构,提供了一种不需要定义类的情况下组合多个值的便捷方式。通过位置字段或命名字段的组合,开发者可以灵活处理一组相关的值,并且通过解构、类型推断等特性,记录为简化代码提供了有力支持。

记录是处理临时数据、函数返回多个值的理想工具,但在需要更复杂的行为或结构时,类仍然是更合适的选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ljguo2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值