共享状态下的生命周期

时间:2019-03-20 10:52:48

标签: rust lifetime

我想要拥有:

  • 具有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;
}

1 个答案:

答案 0 :(得分:4)

由于第一个结构的引用本身具有对另一个结构的引用,因此您还需要指定以下子项的生存期:

struct AppState<'a> {
    services: &'a AppServices<'a>,
}

Playground

这样,您对编译器说AppStateAppServices的生存期是绑定的,因此AppServices成员也具有生存期'a

但是,除了生命周期问题之外,您还具有循环数据结构。如果要在结构之间共享数据,则有一些特定的智能指针,例如Rc和多线程应用程序Arc

代替共享结构的原始指针,您可以共享Arc的智能指针,并借助Mutex来对数据进行突变以保证对线程的单次访问。

A solution that uses an Arc  解决这种循环数据结构问题。