什么是“匿名生命#1”,我该如何以正确的方式定义它?

时间:2017-11-24 17:20:13

标签: rust

我希望下面的Handler将自己推入列表

use std::vec::Vec;
use std::rc::Rc;
use std::cell::RefCell;

struct Handler<'a> {
    list: Rc<RefCell<Vec<&'a mut Handler<'a>>>>
}

impl<'a> Handler<'a> {
    fn new(list: Rc<RefCell<Vec<&'a mut Handler<'a>>>>) -> Self {
        Handler { list: list }
    }

    fn push(&mut self) {
        self.list.borrow_mut().push(self)
    }
}

fn main() {
    let list = Rc::new(RefCell::new(Vec::new()));

    let mut h1 = Handler::new(list);
    let mut h2 = Handler::new(list);

    h1.push();
    h2.push();

    // Here the list should contain both h1 and h2

}

但我遇到了这个错误,我找不到通过它的方法!

error[E0312]: lifetime of reference outlives lifetime of borrowed content...
  --> src/main.rs:15:37
   |
15 |         self.list.borrow_mut().push(self)
   |                                     ^^^^
   |
note: ...the reference is valid for the lifetime 'a as defined on the impl at 9:1...
  --> src/main.rs:9:1
   |
9  | / impl<'a> Handler<'a> {
10 | |     fn new(list: Rc<RefCell<Vec<&'a mut Handler<'a>>>>) -> Self {
11 | |         Handler { list: list }
12 | |     }
...  |
16 | |     }
17 | | }
   | |_^
note: ...but the borrowed content is only valid for the anonymous lifetime #1 defined on the method body at 14:5
  --> src/main.rs:14:5
   |
14 | /     fn push(&mut self) {
15 | |         self.list.borrow_mut().push(self)
16 | |     }
   | |_____^

什么是“匿名生命#1”,我该如何以正确的方式定义它?或者甚至,我的方法在Rust中是否正确解决了这个问题?

1 个答案:

答案 0 :(得分:1)

  

什么是#34;匿名生命#1&#34;

&#34;匿名&#34;意味着没有名字的东西。生命周期是与参考相关的事物。第14行的参考文献在哪里?

fn push(&mut self)
//      ^ here

由于lifetime elision,您不必拥有明确的生命周期,允许它是隐式的(和匿名的)。

您的代码要求Vec包含&'a mut Handler<'a>,但您尝试输入&mut Handler<'a> - 参考的生命周期与生命周期{{1}无关}。错误告诉您这是无效的。您可以通过关联生命周期来修复错误:

'a

但是,这并不能修复整个程序。

您的特定代码结构可能永远不会按您希望的方式工作。您希望拥有一个对处理程序的引用列表,这些处理程序本身包含对处理程序的引用,并且所有这些都需要完全相同的生命周期。但是,您然后声明列表和处理程序都在不同的持续时间内存在,因为它们是单独声明的。

我不知道您为什么想要显示的结构,但如果我需要它,我可能会切换到fn push(&'a mut self) 代替Rc处理程序