Skip to Content

只读数据(Data)

data 声明只读数据:声明即实例,深不可变,由编译期完整校验。适合配置表、策划数值、静态图集描述这类「写死在代码里的数据」。

双面名:既是类型也是值

public data Item { label: "text", } public data Sword { ...Item, name: "铁剑", atk: 10 + 5, tags: ["铁", "初阶"], } func main() -> int { print(Sword.name, Sword.atk); print(Sword.label); return 0; }
铁剑 15 text
  • Sword 在类型位是名义类型,在值位是规范实例。条目以逗号分隔,支持常量算术折叠(10 + 5 得 15)与冻结列表。
  • ...Base 展开其他 data 声明。
  • 条目分隔用逗号,} 前可省。

表达式位字面量

data { ... } 写在表达式位是运行期字面段,同样构造即冻结,适合局部拼装一次性数据:

val d = data { x: 5, y: 6, label: "局部" }; val moved = d with { x: 50 }; print(d.x, moved.x, moved.label);
5 50 局部

表达式起始的 data 后面跟 { 才是字面量,其余位置 data 仍是普通标识符。

with:唯一变异通道

data 值的变异面全关,改数据的唯一方式是 with 派生新值:

val upgraded = Sword with { atk: 99 }; print(upgraded.name, upgraded.atk, Sword.atk);
铁剑 99 15

原 Sword 不变:with 产出全新的冻结实例。需要可变副本时,冻结容器的 ToMutable() 是唯一逃逸舱,定型翻转为对应可变容器,原 data 不受影响:

var mut = Sword.tags.ToMutable(); mut.Add("新"); print(mut.Count, Sword.tags.Count, Sword.name);
3 2 铁剑

值域

条目值收:字面量族、enum / flags 限定名常量、嵌套匿名记录、冻结列表、其他 data 引用、向量构造折叠。拒收:null、非常量、函数值与可变引用、class / struct 实例。

注意

  • data 声明的名字不能 new :实例只来自规范实例槽与 with 派生。
  • 表达式位的 data { ... } 是运行期字面段,构造即冻结,适合局部拼装。
  • 一切 data 值隐式拓宽到内置超类型 Data。
最后更新于 2026年10月9日