本文参考了rustbookch15,加上自己的理解。有兴趣的可以先看看官方文档Rust有两种方式实现mutability继承可变性:比如声明一个struct的时候,指定letmut,那么后面就可以修改这个结构体任意字段的内部可变性:使用CellRefCell来包裹变量或字段,这样即使外部变量是只读的,也可以对其进行修改。看似遗传的可变性就足够了,那为什么还需要它呢?所谓的内部可变性呢?让我们分析两个例子:x+self.y);self.sum.unwrap()},Some(sum)=>sum,}}}fnmain(){leti=Cache{x:10,y:11,sum:None};println!("sumis{}",i.sum());}结构Cache有三个字段,x,y,sum,其中sum模拟lazyinit懒加载模式,上面的代码运行不了,原因很简单,当变量i被let初始化时,它是不可变的。17|leti=Cache{x:10,y:11,sum:None};|-帮助:考虑将其更改为可变的:`muti`18|println!("sumis{}",i.sum());|^cannotborrowasmutableYes有两种方法可以解决这个问题。letmuti是在声明let的时候指定的,但是对于具体的大项目,外层变量很可能是不可变的。这就是内部可变性派上用场的地方。修复usstd::cell::Cell;structCache{x:i32,y:i32,sum:Cell