ZetCode

Dart 记录

最后修改于 2025 年 6 月 7 日

在本文中,我们将探讨如何在 Dart 编程语言中使用记录。记录提供了一种简洁的方式,可以将多个值分组到一个单元中,而无需自定义类。它们是不可变的、有序的且大小固定,这使得它们成为传统数据结构的有效替代方案。

Dart 中的记录在功能上与其他编程语言中的元组相似。它们允许开发人员从函数返回多个值,方便地存储相关数据,并维护清晰、可读的代码。与提供动态大小和可变性的列表不同,记录旨在轻量级且可预测。

使用记录的一个关键优势是提高了类型安全性和结构。记录中的每个字段都保留其独特的类型,确保数据得到正确分类。这使得记录在处理临时、分组数据时特别有用,例如函数输出和中间计算。

通过利用记录,Dart 开发人员可以在没有不必要的样板代码的情况下编写更具表现力、更简洁、更高效的代码。在接下来的部分中,我们将演示如何有效地创建和使用记录。

Dart 记录简单示例

下面的示例演示了如何在 Dart 中创建和使用简单的记录。

main.dart
void main() {
  // Creating a record
  final person = ('John', 30, true);

  // Accessing record elements
  print('Name: ${person.$1}');
  print('Age: ${person.$2}');
  print('Is Active: ${person.$3}');
}

在此程序中,我们创建一个包含姓名、年龄和活动状态的记录。然后,我们访问并打印记录的每个元素。

final person = ('John', 30, true);

我们创建一个包含三个元素的记录:一个字符串、一个整数和一个布尔值。

print('Name: ${person.$1}');
print('Age: ${person.$2}');
print('Is Active: ${person.$3}');

我们使用 $1$2$3 语法访问记录的元素。

$ dart main.dart
Name: John
Age: 30
Is Active: true

带有命名字段的 Dart 记录

记录也可以拥有命名字段,这使得代码更具可读性和自解释性。

main.dart
void main() {
  // Creating a record with named fields
  final person = (name: 'Alice', age: 25, isActive: false);

  // Accessing record elements using named fields
  print('Name: ${person.name}');
  print('Age: ${person.age}');
  print('Is Active: ${person.isActive}');
}

在此程序中,我们创建一个带有命名字段的记录,并使用字段名访问元素。

final person = (name: 'Alice', age: 25, isActive: false);

我们创建一个带有命名字段的记录:nameageisActive

print('Name: ${person.name}');
print('Age: ${person.age}');
print('Is Active: ${person.isActive}');

我们使用命名字段访问记录的元素。

$ dart main.dart
Name: Alice
Age: 25
Is Active: false

函数中的 Dart 记录

记录对于从函数返回多个值特别有用。

main.dart
(String, int) getUserInfo() {
  return ('Bob', 40);
}

void main() {
  final userInfo = getUserInfo();
  print('Name: ${userInfo.$1}');
  print('Age: ${userInfo.$2}');
}

在此程序中,我们定义了一个返回包含姓名和年龄的记录的函数。然后,我们调用该函数并访问返回的值。

(String, int) getUserInfo() {
  return ('Bob', 40);
}

我们定义了一个返回包含两个元素(字符串和整数)的记录的函数。

final userInfo = getUserInfo();
print('Name: ${userInfo.$1}');
print('Age: ${userInfo.$2}');

我们调用函数并访问返回的记录的元素。

$ dart main.dart
Name: Bob
Age: 40

Dart 记录与模式匹配

Dart 支持模式匹配,它允许您将记录解构为单个变量。

main.dart
void main() {
  final person = ('Charlie', 35, true);

  // Destructuring the record
  final (name, age, isActive) = person;

  print('Name: $name');
  print('Age: $age');
  print('Is Active: $isActive');
}

在此程序中,我们使用模式匹配将记录解构为单个变量。

final (name, age, isActive) = person;

我们将记录解构为三个变量:nameageisActive

print('Name: $name');
print('Age: $age');
print('Is Active: $isActive');

我们打印解构变量的值。

$ dart main.dart
Name: Charlie
Age: 35
Is Active: true

Dart 记录作为 Map 键

记录可以用作 Dart Map 的键。具有相同值的记录被视为相等,并且具有相同的哈希码。

main.dart
void main() {
  final record1 = ('apple', 1);
  final record2 = ('banana', 2);
  final record3 = ('apple', 1);

  final map = {
    record1: 'Red fruit',
    record2: 'Yellow fruit',
  };

  print(map[record1]); // Red fruit
  print(map[record3]); // Red fruit (record1 == record3)
}

在此示例中,record1record3 相等,因此它们引用同一个 Map 条目。

集合中的 Dart 记录

您可以将记录存储在列表和集合中。Dart 对记录使用值相等性,因此不会将重复项添加到集合中。

main.dart
void main() {
  final r1 = ('x', 10);
  final r2 = ('y', 20);
  final r3 = ('x', 10);

  final list = [r1, r2, r3];
  print(list);

  final set = {r1, r2, r3};
  print(set);
}

即使添加了三个记录,集合也只包含两个唯一的记录。

带有位置字段和命名字段的 Dart 记录

记录可以同时拥有位置字段和命名字段。您可以使用各自的语法访问它们。

main.dart
void main() {
  final data = ('A', 42, flag: true, description: 'sample');

  print('First: \'${data.$1}\'');
  print('Second: ${data.$2}');
  print('Flag: ${data.flag}');
  print('Description: ${data.description}');
}

此记录包含两个位置字段和两个命名字段。使用 $1$2 访问位置字段,并使用字段名访问命名字段。

来源

Dart 记录 - 语言文档

在本文中,我们介绍了 Dart 中使用记录的基础知识。记录是一种以轻量级且不可变的方式对数据进行分组的强大功能。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程