繁体   English   中英

尝试将 Boxed dyn Trait 传递到 Function 时出现“借来的值不够长”的错误

[英]Getting “borrowed value does not live long enough” Error While Trying to Pass a Boxed dyn Trait into a Function

我是 rust 的新手,我对借用检查器的行为感到非常困惑。

trait Foo {
  fn foo(&self);
}

struct Bar<'a> {
  pub f : &'a Vec<i32>
}

impl<'a> Foo for Bar<'a> {
  fn foo(&self) {
    for i in self.f {
      println!("{}", i);
    }
  }
}

fn call(b : &Box<dyn Foo>) {
  b.foo();
}

fn main() {
  let a = vec!(1,2,3);
  let b : Box<dyn Foo> = Box::new(Bar {f : &a});
  call(&b)
}

通过编译这段代码,我得到:

error[E0597]: `a` does not live long enough
  --> main.rs:23:44
   |
23 |   let b : Box<dyn Foo> = Box::new(Bar {f : &a});
   |                          ------------------^^--
   |                          |                 |
   |                          |                 borrowed value does not live long enough
   |                          cast requires that `a` is borrowed for `'static`
24 |   call(&b)
25 | }
   | - `a` dropped here while still borrowed

有人可以向我解释为什么在这种情况下a活得不够长吗? 在我看来,它将贯穿程序的整个生命周期。

默认情况下, Box<dyn Foo>表示Box<dyn Foo + 'static> ,因此只有'static值可以存储在Box<dyn Foo>中。 a在 function 中创建,因此它不适用于'static

您可以使用生命周期参数来调整生命周期:

fn call<'a>(b: &Box<dyn Foo + 'a>) {
    b.foo();
}

操场

注意main function不是“程序的整个循环”。 有一些初始化代码在main被调用之前运行,一些拆解代码在它返回之后运行。 因此,Rust 编译器处理main的方式与任何其他 function 没有区别。

在您的情况下,由于您没有明确指定它,编译器假定要call的参数是对Box<dyn Foo +'static>的引用。 您可以通过自己指定生命周期来覆盖它:

fn call<'a>(b: &Box<dyn Foo + 'a>) {
    b.foo();
}

操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM