E4094

E4094#

不能修改只读字段。

对于只读结构体,您不能使用赋值在定义类型的包之外修改字段的值。

错误示例#

假设您在模块 username/hello 中有一个包 a

a/moon.pkg.json:

{}

a/a.mbt:

pub struct T {
  mut value : Int
}

pub fn T::new() -> T {
  T::{ value: 0 }
}

pub fn T::set(self : T, value : Int) -> Unit {
  self.value = value
}

您在相同模块中还有另一个包 b

b/moon.pkg.json:

{
  "is-main": true,
  "import": [
    "username/hello/a"
  ]
}

b/b.mbt:

fn main {
  let a = @a.T::new()
  a.value = 3 // Error: Cannot modify a read-only field: value
}

建议#

如果您有控制定义类型的包,您可以简单地使结构体具有 pub(all) 可见性。

`a/a.mbt

pub(all) struct T {
  mut value : Int
}

然而,这可能不是隐藏结构体实现细节或保护结构体不变量的最佳解决方案。我们建议使用 getter/setter 模式来保护对结构体字段的访问。

b/b.mbt:

fn main {
  let a = @a.T::new()
  a.set(3)
}