gpt4 book ai didi

rust - 如何解决这个 "does not live long enough"?

转载 作者:行者123 更新时间:2023-11-29 08:18:53 25 4
gpt4 key购买 nike

我想使用一些最小的示例库代码:

struct MyR<'a> {
x: &'a str,
}

struct T {
x: &'static str,
}

impl T {
fn bar<'a>(&'a self) -> MyR {
MyR { x: self.x }
}
}

以下是我的代码:

trait A<R, F: FnMut(&R)> {
fn foo(&mut self, callback: &mut F);
}

impl<'a, F> A<MyR<'a>, F> for T
where F: FnMut(&MyR<'a>)
{
fn foo(&mut self, callback: &mut F) {
let t = T { x: "l" };
let r = t.bar(); // t does not live long enough (for 'a)
callback(&r);
println!("abc");
}
}

fn test() {
let mut t = T { x: "l" };
let mut i = 1;
t.foo(&mut |x| { i += x.x.len(); });
}

我想制作一个由回调参数化的特征,但我很难做到正确。如果我不使用特征,它会很好地工作:

impl T {
fn foo<F: FnMut(&MyR)>(&mut self, callback: &'a mut F) {
let t = T { x: "l" };
let r = t.bar();
callback(&r);
println!("abc");
}
}

但是我不能这样做:

impl T {
fn foo<'a, F: FnMut(&MyR<'a>)>(&mut self, callback: &mut F) {
let t = T { x: "l" };
let r = t.bar();
callback(&r);
println!("abc");
}
}

我知道问题是 t 必须比 'a 长,但我不知道绑定(bind) 'a 以便它的生命周期比 t 短。

我正在使用 rustc 1.19.0-nightly。

最佳答案

阅读错误信息:

  1. t 存活时间不够长 — 它一直存活到 foo 函数结束。
  2. 借用的值必须在生命周期 'a 内有效已指定 'a:

    impl<'a, F> A<MyR<'a>, F> for T
    where F: FnMut(&MyR<'a>)

    这表示对于任何可能的生命周期,只要 F 实现了 FnMut 特性,特性就会被实现。

只有 一个 可能的方法来实现它——你必须有一个 MyR,它用 'static 生命周期参数化。这是唯一可以保证比任何任意生命周期都长的生命周期。

让我们看看 MyR 来自哪里:

fn bar<'a>(&'a self) -> MyR {
MyR { x: self.x }
}

如果你回去重读The Rust Programming Language section on lifetime elision ,您会发现此生命周期规范没有任何值(value)。它定义了生命周期并将其与 self 一起使用,但它从不与任何输出生命周期相关联。代码相同:

fn bar<'a, 'b>(&'a self) -> MyR<'b>

如果你删除了生命周期,那么你将拥有

fn bar(&self) -> MyR
fn bar<'a>(&'a self) -> MyR<'a> // equivalent

但是,这些都不是'static 生命周期。对你来说幸运的是,你知道 x 是一个 &'static str,所以你可以在你的签名中反射(reflect)它并且代码将编译:

fn bar(&self) -> MyR<'static>

关于rust - 如何解决这个 "does not live long enough"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44059574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com