相关疑难解决方法(0)

更高排名的特质限制和盒装封闭寿命问题

我正在尝试编写一个函数返回一个盒装闭包,它可以处理对任何生命周期的类型的引用.在编写特定实例时,一切正常.但是在编写通用版本时,我会遇到终身问题.

struct Parameter<'a> {
    s: &'a str,
}

fn main() {
    let closure = generate_closure_gen();
    let string = String::from("Hello World!");
    let parameter = Parameter { s: &string }; // Error: string does not live long enough
    closure(&parameter);
}

// This one works fine
// Desugared version for Box<Fn(&Parameter)>
fn generate_closure() -> Box<for <'a, 'r> Fn(&'r Parameter<'a>)> {
    Box::new(|c: &Parameter| {})
}

// This one gives lifetime errors
fn generate_closure_gen<C>() -> Box<Fn(&C)> {
    Box::new(|c: &C| {})
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么闭包需要类型参数比它更长寿(没有存储或任何东西......).它适用于具有HRTB的非通用版本,它只是觉得应该可以使它与泛型版本一起使用.
此外,如果我尝试使用通用版本编写特定版本,我会收到类型错误

// Desugared …
Run Code Online (Sandbox Code Playgroud)

lifetime rust

8
推荐指数
1
解决办法
429
查看次数

标签 统计

lifetime ×1

rust ×1