Record抽象 最终

记录值。

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 成员的名称: hashCoderuntimeTypetoStringnoSuchMethod
  • 同一记录中位置获取器的名称,因此 (0, $1: 0) 是无效的,但 (0, $2: 0) 是有效的,因为在 那个 记录形状中没有具有获取器 $2 的位置字段。 (这仍然会令人困惑,并且应在实践中避免使用。)
  • 此外,不允许以下划线 _ 开始的名称。字段名称不能是库私有。

记录对象的运行时类型是记录类型,因此也是 Record 的子类型,间接是 Object 及其超类型的子类型。

记录值没有持久的 identical 行为。对记录对象的引用可以在任何时候更改到对另一个具有相同形状和字段值的不同记录对象的引用。

除此之外,记录类型只能作为具有相同形状的其他记录类型的子类型,并且只有当第一个记录类型的字段类型是其他记录类型对应字段类型的子类型时。也就是说,(int, String, {bool isValid})(num, String, {Object isValid}) 的子类型,因为它们具有相同的形状,并且字段类型是逐点的子类型。具有不同形状的记录类型彼此无关。

构造函数

Record()

属性

hashCode int
== 兼容的哈希码。
无设置器覆盖
runtimeType Type
表示记录运行时类型的 Type 对象。
无设置器覆盖

方法

noSuchMethod(Invocation invocation) → dynamic
当访问不存在的方法或属性时调用。
继承
toString() String
创建记录的字符串表示形式。
override

运算符

operator ==(Object other) bool
检查 other 是否与这个记录具有相同的形状和相等的字段。
override