让我困惑的是,为什么
RefMut
由借用检查器考虑,当这些规则在运行时强制执行时,表面上是
RefCell
.
在运行时强制执行规则是
RefCell
但就其内容而言。这个
只有
内部可变类型喜欢的东西
RefCell
给你的是通过共享引用进行变异的能力。假使
RefCell
,这允许您获得
&mut T
来自
&RefCell<T>
。换句话说,这允许您“升级”共享借用(
&
)独家借款(
&mut
)但要做到这一点
你仍然需要的共享借用
RefCell
.
这反映在的签名中
RefCell::borrow_mut
:
pub fn borrow_mut(&self) -> RefMut<'_, T>
如果我们取消明确取消的寿命:
pub fn borrow_mut<'a>(&'a self) -> RefMut<'a, T>
所以你可以看到
RefMut
借用自
*self
这个
RefCell
). (如果没有,这意味着你可以放弃
RefCell
而你有
RefMut
指着它。这听起来不太好!)
看起来像
render_frame
拿
&mut self
,这导致了问题:
RefMut
持有共同借款
self
但是
渲染帧
想要一个
独家
借
如果没有看到代码的其余部分,很难准确地说出如何解决这个问题。一种选择是
渲染帧
拿
&self
而不是
&mut self
,在这种情况下是允许的。然而,这样做可能需要使更多此类部分使用内部可变性。
听起来很像是从面向对象的角度来处理这个问题,而这样的设计在Rust中往往不能很好地工作。也许是任何类型
自己
这里的代表做得太多了,需要分开。