记录值。
Record
类是所有 记录类型 的超类型,但它本身不是任何对象实例的运行时类型(它是一个抽象类)。所有实现 Record
的对象都具有记录类型作为它们的运行时类型。
由记录类型描述的记录值由多个字段组成,每个字段要么是位置字段,要么是命名字段。
记录值和记录类型与参数列表和简化的函数类型参数列表的写法类似(不允许也不需要 required
修饰符,因为记录字段永不可选)。例如
(int, String, {bool isValid}) triple = (1, "one", isValid: true);
在语法上类似于
typedef F = void Function(int, String, {bool isValid});
void callIt(F f) => f(1, "one", isValid: true);
每个记录和记录类型都有一个 形状,由位置字段的数量和命名字段的名称给出。例如
(double value, String name, {String isValid}) another = (
3.14, "Pi", isValid: "real");
是另一个具有相同 形状(两个位置字段,一个名为 isValid
的命名字段)的记录声明,但类型不同。位置字段上写出的名称完全是为了文档目的,它们对程序没有影响(就像函数类型中的位置参数上的名称一样,例如 typedef F = int Function(int value);
,其中标识符 value
没有影响)。
记录值主要使用模式进行解构,例如
switch (triple) {
case (int value, String name, isValid: bool ok): // ....
}
也可以使用命名获取器访问单个字段,使用 $1
、$2
等. 为位置字段,以及字段本身的名称为命名字段。
int value = triple.$1;
String name = triple.$2;
bool ok = triple.isValid;
因此,一些标识符不能用作命名字段的名称
Object
成员的名称:hashCode
、runtimeType
、toString
和noSuchMethod
。- 同一记录中的位置获取器的名称,因此
(0, $1: 0)
是无效的,但(0, $2: 0)
是有效的,因为在 该 记录形状中没有具有获取器$2
的位置字段。(它仍然会令人困惑,并且应该在实际中避免。) - 此外,不允许以下划线
_
开头的名称。字段名称不能是库私有。
记录对象的运行时类型是记录类型,因此它是 Record 的子类型,并且间接是 Object 及其超类型的子类型。
记录值没有持久的 identical 行为。记录对象的引用可以随时更改到另一个具有相同形状和字段值的记录对象的引用。
除此之外,记录类型只能作为具有相同形状的另一个记录类型的子类型,并且只有当前者记录类型的字段类型是后者对应字段类型的子类型时。也就是说,(int, String, {bool isValid})
是 (num, String, {Object isValid})
的子类型,因为它们具有相同的形状,字段类型是逐点子类型。不同形状的记录类型之间互不相关。
属性
- hashCode → int
- 与
==
兼容的哈希码。无设置器覆盖 - runtimeType → Type
- 表示记录运行时类型的
类型
对象。无设置器覆盖
方法
-
noSuchMethod(
Invocation invocation) → dynamic - 当访问不存在的方法或属性时调用。继承
-
toString(
) → String - 创建记录的字符串表示形式。重写
运算符
-
operator ==(
Object other) → bool - 检查
other
是否与此记录具有相同的形状和相等的字段。重写