Dart 记录
最后修改于 2025 年 6 月 7 日
在本文中,我们将探讨如何在 Dart 编程语言中使用记录。记录提供了一种简洁的方式,可以将多个值分组到一个单元中,而无需自定义类。它们是不可变的、有序的且大小固定,这使得它们成为传统数据结构的有效替代方案。
Dart 中的记录在功能上与其他编程语言中的元组相似。它们允许开发人员从函数返回多个值,方便地存储相关数据,并维护清晰、可读的代码。与提供动态大小和可变性的列表不同,记录旨在轻量级且可预测。
使用记录的一个关键优势是提高了类型安全性和结构。记录中的每个字段都保留其独特的类型,确保数据得到正确分类。这使得记录在处理临时、分组数据时特别有用,例如函数输出和中间计算。
通过利用记录,Dart 开发人员可以在没有不必要的样板代码的情况下编写更具表现力、更简洁、更高效的代码。在接下来的部分中,我们将演示如何有效地创建和使用记录。
Dart 记录简单示例
下面的示例演示了如何在 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 记录
记录也可以拥有命名字段,这使得代码更具可读性和自解释性。
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);
我们创建一个带有命名字段的记录:name、age 和 isActive。
print('Name: ${person.name}');
print('Age: ${person.age}');
print('Is Active: ${person.isActive}');
我们使用命名字段访问记录的元素。
$ dart main.dart Name: Alice Age: 25 Is Active: false
函数中的 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 支持模式匹配,它允许您将记录解构为单个变量。
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;
我们将记录解构为三个变量:name、age 和 isActive。
print('Name: $name');
print('Age: $age');
print('Is Active: $isActive');
我们打印解构变量的值。
$ dart main.dart Name: Charlie Age: 35 Is Active: true
Dart 记录作为 Map 键
记录可以用作 Dart Map 的键。具有相同值的记录被视为相等,并且具有相同的哈希码。
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)
}
在此示例中,record1 和 record3 相等,因此它们引用同一个 Map 条目。
集合中的 Dart 记录
您可以将记录存储在列表和集合中。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 记录
记录可以同时拥有位置字段和命名字段。您可以使用各自的语法访问它们。
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 教程。