Rust 内部可变性的访问器模式
内部可变性的访问器模式(Interior Mutability Accessor Pattern)
我有一个类,类内部有一个被 Mutex 保护的字段,想访问这个字段,最简单的方式是为类实现方法,在方法内部实现访问此字段的逻辑。
但如果想让整个架构“模块化”,不希望把访问字段的具体逻辑放在类内部,怎么办呢?
第一时间想到的是把这个字段暴露给外部,比如给类实现一个方法返回 &Mutex<inner_mut> 类型。但这样就把锁暴露给外部了,管理锁的逻辑也暴露给外部了。外部调用不方便(还需要释放锁),也不安全。
这时候可以用到“内部可变性的访问器模式”,为类加入如下的两个函数,函数内部掌控持有锁的周期,函数以闭包为参数,闭包在类(模块)外部实现,定义访问被保护字段的具体逻辑。
/// Access vm_ctx mutably through a closure
pub fn with_vm_ctx_mut<F, R>(&self, f: F) -> R
whereF: FnOnce(&mut VmContext) -> R,
{let mut inner = self.inner.inner_mut.lock();f(&mut inner.vm_ctx)
}// 调用处的代码
cur_vcpu.with_vm_ctx_mut(|vm_ctx| {vm_ctx.gic_save_context(); # vcpu 模块外部的代码,架构相关的代码
});