我想要拥有:
AppState
的{{1}},AppServices
应该具有服务AppServices
,IdService
本身应该有权访问IdService
。以下是我提出的想法,但我无法正确完成生命周期标记。
AppState
编译器输出:
struct IdService<'a> {
name: String,
state: &'a AppState,
}
struct AppServices<'a> {
id: Option<&'a IdService>,
}
struct AppState<'a> {
services: &'a AppServices,
}
impl<'a> AppState<'a> {
pub fn new() -> Self {
AppState {
services: AppServices { id: None },
};
}
}
fn main() {
let mut state = AppState::new();
let id_service = IdService {
name: "test".to_string(),
state: state,
};
let services = AppServices {
id: Some(id_service),
};
state.services = services;
}
答案 0 :(得分:4)
由于第一个结构的引用本身具有对另一个结构的引用,因此您还需要指定以下子项的生存期:
struct AppState<'a> {
services: &'a AppServices<'a>,
}
这样,您对编译器说AppState
和AppServices
的生存期是绑定的,因此AppServices
成员也具有生存期'a
。
但是,除了生命周期问题之外,您还具有循环数据结构。如果要在结构之间共享数据,则有一些特定的智能指针,例如Rc
和多线程应用程序Arc
。
代替共享结构的原始指针,您可以共享Arc
的智能指针,并借助Mutex
来对数据进行突变以保证对线程的单次访问。
A solution that uses an Arc
解决这种循环数据结构问题。