E4202

E4202#

编译器诊断名称:update_struct_with_priv_field

结构体更新语法会先从原值复制每个字段,然后再应用显式写出的字段修改。如果结构体包含来自另一个包的私有字段,包外代码不能直接执行这个复制。

错误示例#

被导入的包定义了一个包含私有字段的结构体:

///|
pub(all) struct User {
  name : String
  priv id : Int
}

///|
pub let default_user : User = { name: "old", id: 1 }

调用方不能对该结构体使用更新语法:

///|
fn rename(user : @lib.User) -> @lib.User {
  { ..user, name: "new" }
}

///|
test {
  ignore(rename(@lib.default_user))
}

建议#

将更新逻辑移到拥有这些私有字段的包中,或暴露一个执行更新的辅助函数。

///|
pub(all) struct User {
  name : String
  priv id : Int
}

///|
pub let default_user : User = { name: "old", id: 1 }

///|
pub fn rename(user : User) -> User {
  { name: "new", id: user.id }
}
///|
test {
  inspect(@lib.rename(@lib.default_user).name, content="new")
}