我有一个类似这样的场景:Rust Playground
- 我有一个带有锁的结构体
Container
,该锁保护多个成员。我不想为每个成员使用RwLock。 - 我想获取这个锁,然后调用另一个函数
complex_mutation
,该函数执行一些复杂逻辑并改变这个结构体。 - 问题是锁的RAII守卫
_guard
获取了一个引用,然后调用另一个函数complex_mutation
,其中传递了&mut self
,导致了多个不可变+可变引用。 - 我不能在创建另一个可变引用之前放弃守卫,因为这正是提供同步的地方。
- 如果我可以将
complex_mutation
中的所有内容内联,那么这个问题就解决了,但对于真实世界的情况来说,这太丑陋了。
这是C++中常见的模式。在RUST中如何解决这个问题?
complex_mutation
吗? - undefinedcomplex_mutation
是一个已存在的辅助函数,我宁愿不修改它。 - undefined&mut self
。请记住,&mut
引用是排他的,所以程序中的任何其他部分都无法访问*self
。只需移除锁即可。 - undefinedRwLock<()>
只保护了()
,没有其他作用。你应该使用RwLock<(u32, u32)>
,这样它就包含了要保护的数据。这与 C++ 中的做法不同。 - undefined&mut
,那么可以保证程序中没有其他地方可以读取或写入该引用指向的内容。像RwLock
这样的类型提供了所谓的“内部可变性”,这是一种概念,允许在特定情况下从共享引用(&
)转换为独占引用(&mut
)。如果你拥有一个独占引用,就不需要内部可变性。因此,如果你使用&self
,那么RwLock
会很有用,但如果你使用&mut self
,它就不会有用。 - undefined