Время жизни с общим состоянием - PullRequest
3 голосов
/ 20 марта 2019

Я хочу иметь:

  • и AppState, который имеет AppServices,
  • , этот AppServices должен иметь услуги IdService,
  • IdService сам должен иметь доступ к AppState.

Ниже приведена идея, с которой я пришел, но я не могу правильно сделать маркеры времени жизни.101

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;
}

Выход компилятора:

error[E0106]: missing lifetime specifier
 --> src/main.rs:3:16
  |
3 |     state: &'a AppState,
  |                ^^^^^^^^ expected lifetime parameter

error[E0106]: missing lifetime specifier
 --> src/main.rs:6:20
  |
6 |     id: Option<&'a IdService>,
  |                    ^^^^^^^^^ expected lifetime parameter

error[E0106]: missing lifetime specifier
  --> src/main.rs:10:19
   |
10 |     services: &'a AppServices,
   |                   ^^^^^^^^^^^ expected lifetime parameter

1 Ответ

4 голосов
/ 20 марта 2019

Поскольку ваша первая структура имеет ссылку, в которой есть ссылка на другую структуру, вам также необходимо указать время жизни этих детей:

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

Детская площадка

Таким образом, вы говорите компилятору, что время жизни AppState и AppServices ограничено, поэтому AppServices члены также имеют время жизни 'a.

Однако, помимо проблем времени жизни, у вас есть циклическая структура данных. Если вы хотите обмениваться данными между структурами, есть несколько специальных интеллектуальных указателей, таких как Rc и для многопоточных приложений Arc.

Вместо совместного использования необработанных указателей структуры вы можете совместно использовать Arc интеллектуальных указателей и изменять данные с помощью Mutex, чтобы гарантировать единый доступ для потока.

Решение, которое использует Arc решить такую ​​проблему циклической структуры данных.

...