为什么我需要“静态生命周期”以及如何修复它?

Rez*_*eza 5 rust

我已经删除了所有额外的不相关代码,以生成这个干净的代码来重现我收到的错误:

trait EventsHandler{}
struct Engine{}
struct Request{}
struct RequestHandler<'a> {
    r: &'a mut Request
}
impl<'a> EventsHandler for RequestHandler<'a>{}

impl Engine {
    pub fn exec(&mut self, script: &str, handler: Box<dyn EventsHandler>){ }
}

pub fn handle_request(script: &str, r: &mut Request) {
    let r_h:RequestHandler =RequestHandler {r};
    let handler = Box::new(r_h);
    let mut engine = Engine{};     
    engine.exec(script, handler);
}
Run Code Online (Sandbox Code Playgroud)

错误是:

error: explicit lifetime required in the type of `r`
label: lifetime `'static` required
Run Code Online (Sandbox Code Playgroud)

错误指向最后一行代码中的参数“handler”。

据我所知,一切似乎都活得足够长。我不明白为什么需要静态以及如何去解决该需求或重写代码以避免该要求。

Win*_*ill 1

trait EventsHandler{}
struct Engine{}
    
pub struct Request{}
pub struct RequestHandler<'a> {
    r: &'a mut Request
}
impl<'a> EventsHandler for RequestHandler<'a>{}

impl<'a> Engine {
    pub fn exec(&'a mut self, script: &'a str, handler: Box<dyn EventsHandler + 'a>){ }
}

pub fn handle_request<'a>(script: &'a str, r: &'a mut Request){
    let r_h:RequestHandler =RequestHandler {r};
    let handler = Box::new(r_h);
    let mut engine = Engine{};     
    engine.exec(script, handler);
}
Run Code Online (Sandbox Code Playgroud)

我真的不知道如何解释,但这就是我按照错误消息中的提示所做的。现在可以编译了。

希望其他人能够给出更好的解释。:)

或者您可以看看:带有特征对象的盒子需要静态生命周期?