【发布时间】:2021-10-15 07:49:39
【问题描述】:
我有两个相互引用的结构。一旦初始化,它们在应用程序的剩余生命周期内都不会发生变异。
可以将它们包装在 Mutex 或 RwLock 或其他东西中,但最好不要在整个代码库中处理这些,只是为了初始化。
这是示例代码(不编译):
use std::sync::Arc;
struct First {
second: Option<Second>,
}
struct Second {
first: Option<Arc<First>>,
}
fn main() {
let first = Arc::new(First { second: None });
let mut second = Second { first: None };
second.first = Some(first.clone());
first.second = Some(second);
}
问题:
error[E0594]: cannot assign to data in an `Arc`
--> src/main.rs:14:5
|
14 | first.second = Some(second);
| ^^^^^^^^^^^^ cannot assign
|
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Arc<First>`
这里发生了什么很清楚;无法分配给 first,因为它位于 Arc 内部,不允许内部可变性。
更改操作顺序并不能解决问题。
使用Arc::get_mut() 将不起作用,因为Arc 被克隆以存储在second.first 中。
那么,是否可以使用这种模式创建对象而不需要运行时锁定?
【问题讨论】:
标签: rust