类型
1.记录(Record)
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 是一个包含三个字段的记录,字段可以通过 2、
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. 记录的限制
不可变:记录中的字段是不可变的,一旦创建不能修改。如果需要修改某个字段的值,需要创建一个新的记录。
没有方法或属性:记录仅仅是用于存储数据的结构,不能像类一样包含方法或其他复杂的逻辑。