非mut的传染性

非mut不具有传染性。例如

struct T {
  mut s:Int
}
f(a: T) { let mut a = a; a.s = 42 }

let a = { s:101 }
f(a)
println(a.s)

这里一个immut的a可以被在另一处重新mut然后修改,感觉会容易导致错误。

MoonBit对结构体内部的mut成员,能够直接提供interior mutability(内部可变性)。实际上即使a全程一直保持不可变绑定,也仍然能在任意位置修改a.s成员。这里和Rust还是不太一样。

如果需要保持内部成员不可变,肯定是需要用getter和setter保护。

1 个赞