Rust生命周期参数必须超过静态生命周期。

4
我正在按照这个教程来构建一个类似Rogue-like的游戏,我决定开始使用specs调度程序来更轻松地注册和执行系统。
为此,我在我的State结构中添加了一个Dispatcher

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个回答

4
"GameState"要求实现者必须是'static。"
pub trait GameState: 'static {...}

为了满足 'static 生命周期,您的类型不能包含比 'static 更短的引用。因此,如果您无法使 'a'b 成为 'static,唯一的选择就是不将 Dispatcher 放在 State 中。
让生命周期 'a "超过 'static" 意味着 'a 必须等于或长于 'static(是的,'static 是可能的最长生命周期)。Rust issue for a similar error

如何使生命周期静态? - Thermatix
@Thermatix 你可以尝试这样做,但如果“Dispatcher”本质上借用了某些东西,则可能不起作用:将“State”更改为“struct State { pub ecs: World, pub dsp: Dispatcher<'static, 'static> }”,并修复由此产生的错误。我无法就这个具体的例子给出任何建议,因为我不熟悉specs,但我猜测specs和rltk并不是真正设计成以这种方式一起工作的。除了在游戏状态中存储“Dispatcher”之外,没有其他地方可以存储它吗? - trent
成功了!但我想知道,有什么后果或者需要注意的地方吗?我的意思是,应该没问题,因为我打算让调度程序一直存在到程序结束,所以'static生命周期应该没问题。 - Thermatix
2
生命周期存在是为了帮助借用检查器更好地理解您的代码和借用。不正确使用它们通常意味着您将无法正确管理对已创建结构体的引用,这意味着您将获得不合理或过于严格的借用检查器错误,使代码无法使用。 如果您以不正确的方式欺骗借用检查器(使用不安全的代码),通常会导致运行时分段错误或未定义的行为,特别是在某个对象曾经存在的位置读取垃圾数据时。 - Tin Svagelj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接