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")
}