只读数据(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
textSword在类型位是名义类型,在值位是规范实例。条目以逗号分隔,支持常量算术折叠(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日
