HostAccess 写穿模型
HostAccess 是调用作用域的 host effects 边界。它不是事务日志,也不会在
后续操作失败时回滚之前已经完成的写入。
fn main(player: Player) { player.level += 1; return player.level;}复合赋值会解析成 host mutation:
resolve HostAccessSpec(Mutate(Add), player.level)validate schema, capability, generation, and adapter policyread or mutate current host valuewrite the result immediately脚本在同一次调用里可以观察到之前的写入,因为 adapter state 已经改变。
Host access 可以被 schema、capability、generation 或 adapter policy 拒绝。
常见情况包括 read-only fields、缺少 HostWrite、字段写入被拒绝、方法调用
被拒绝、stale handles,以及不支持 keyed access。
fn main(player: Player) { player.id = 8; // 如果 Player.id 是只读字段,会被拒绝}Adapter 契约
Section titled “Adapter 契约”Adapter 先 resolve access,再执行操作。
fn resolve_host_access(&self, spec: HostAccessSpec<'_>) -> HostResult<ResolvedHostAccess>;
fn mutate_host( &mut self, access: ResolvedHostAccess, target: HostTargetInstance<'_>, op: HostMutationOp, rhs: HostValue,) -> HostResult<()>;复杂 host collection mutation 应由 adapter 定义。默认模型不会把宿主集合 clone 成脚本值、修改 clone、再写回去。