Срок службы ржавчины должен превышать срок службы c - PullRequest
0 голосов
/ 23 января 2020

Итак, я следую этому учебному пособию , чтобы создать мошенник, и я решил начать использовать диспетчер спецификаций, чтобы немного упростить регистрацию и выполнение систем.

для этого я добавил Dispatcher в мою структуру State:


use rltk::{GameState, Rltk};
use specs::world::World;
use specs::Dispatcher;


pub struct State<'a, 'b> {  // <-- Added new lifetime params here for dispacher
    pub ecs: World,
    pub dsp: Dispatcher<'a, 'b>,
}

Но это когда я пытаюсь реализовать черту GameSate для этого я сталкиваюсь с проблемами:

impl<'a, 'b> GameState for State<'a, 'b> {
    fn tick(&mut self, ctx: &mut Rltk) {
        ctx.cls();
        self.dsp.dispatch(&mut self.ecs);
        self.ecs.maintain();
    }
}

Я получаю эти ошибки:

error[E0478]: lifetime bound not satisfied
  --> src/sys/state.rs:96:14
   |
96 | impl<'a, 'b> GameState for State<'a, 'b> {
   |              ^^^^^^^^^
   |
note: lifetime parameter instantiated with the lifetime `'a` as defined on the impl at 96:6
  --> src/sys/state.rs:96:6
   |
96 | impl<'a, 'b> GameState for State<'a, 'b> {
   |      ^^
   = note: but lifetime parameter must outlive the static lifetime

error[E0478]: lifetime bound not satisfied
  --> src/sys/state.rs:96:14
   |
96 | impl<'a, 'b> GameState for State<'a, 'b> {
   |              ^^^^^^^^^
   |
note: lifetime parameter instantiated with the lifetime `'b` as defined on the impl at 96:10
  --> src/sys/state.rs:96:10
   |
96 | impl<'a, 'b> GameState for State<'a, 'b> {
   |          ^^
   = note: but lifetime parameter must outlive the static lifetime

Он хочет, чтобы времена жизни 'a, 'b пережили 'static, что звучит невозможно, поскольку я уверен, что 'static - это время жизни всей программы.

Как мне решить эту проблему?

1 Ответ

2 голосов
/ 23 января 2020

GameState требует, чтобы у разработчиков было 'static:

pub trait GameState: 'static {...}

Чтобы соответствовать сроку жизни 'static, ваш тип не должен содержать ссылок короче 'static. Итак, если вы не можете сделать 'a и 'b обоими равными 'static, единственный вариант - не помещать Dispatcher внутри State.

...