E4087

E4087#

尝试修改不可变的对象,例如变量或结构体的字段。

MoonBit 要求程序员明确声明可变的变量和结构体字段。请注意,MoonBit 中变量的可变性仅指变量本身,而不是它持有的值。如果您声明了一个不可变的变量,但变量的类型是 Array[T]Ref[T] 或有可变字段的 struct,您依然可以修改变量的内部结构,只是不能整个替换变量的值。

元组永远是不可变的,如果想要可变性,应当使用有可变字段的 struct

错误示例:#

test {
  let a = @ref.new(0)
  a = @ref.new(1) // Error: The variable a is not mutable.
  a.val = 1 // This is valid, because the mutability come from `Ref` type itself
  println(a)
}

struct S {
  x : Int
}

test {
  let s = { x: 1 }
  s.x = 2 // Error: The field `x` is not mutable.
}

建议#

为了修复此错误,您需要将变量或结构体字段声明为可变的,方法是在变量名前添加 mut 关键字。

test {
  let mut a = 0
  a = 1
  println(a)
}

struct S {
  mut x : Int
//^^^
}

test {
  let s = { x: 1 }
  s.x = 2
}