在学习 Rust 并尝试完成一个示例时,其中需要跨线程和函数共享数据库
Db
。
我已经将数据库(一个结构)包装在一个
Arc
中,并在该结构中,用一个Mutex
保护成员:
pub struct Db{
pub db: Mutex<BTreeMap<String, String>>,
}
但是,尝试通过关联方法更新
Db
时出现错误:
help: trait
需要通过dereference修改,但是对于DerefMut
没有实现Arc<Db>
我看过this SO post,但不是
Arc::new(Mutex::new(Db))
,我只通过Arc::new(Db)
理解数据库的内部成员是互斥保护的。
问题 我如何向编译器指示
Db
的内部数据成员受到访问保护,以便成功构建最小示例链接?如果这是可能的,这是推荐的方法吗?
其他信息
rustc 1.65.0 (897e37553 2022-11-02)
目前,你有
impl Db {
pub fn add(&mut self, data: String) -> Option<String> { ... }
}
但是,正如您所说,您在
Mutex
中保护数据库。所以你不需要mut
访问:
impl Db {
pub fn add(&self, data: String) -> Option<String> { ... }
}
看,
&mut
在 Rust 中的真正意思是“独占”或“唯一”访问。 Rust 会强制 &mut
引用在编译时是唯一的,这就是它给你那个错误的原因。 Mutex
只需要一个“共享的”(不可变的)&
引用,并在运行时强制执行相同的规则。
删除
mut
实际上是使您的示例工作所需的全部