Rust 什么是「;匿名一生“1”;我如何用正确的方式来定义它?

Rust 什么是「;匿名一生“1”;我如何用正确的方式来定义它?,rust,Rust,我希望下面的处理程序将自己推到列表中 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<RefCel

我希望下面的
处理程序
将自己推到列表中

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

}
使用std::vec::vec;
使用std::rc::rc;
使用std::cell::RefCell;
结构处理程序src/main.rs:9:1
|
9 |/impl{
10 | | fn新(列表:Rc>)->Self{
11 | |处理程序{list:list}
12 | |     }
...  |
16 | |     }
17 | | }
| |_^
注意:…但借用的内容仅对方法体上14:5定义的匿名生存期1有效
-->src/main.rs:14:5
|
14 |/fn推送(&mut self){
15 | | self.list.borrow_mut().push(self)
16 | |     }
| |_____^
什么是“匿名生命周期#1”,我如何以正确的方式定义它?甚至,我对锈蚀问题的处理方法是否正确

什么是“匿名一生”#1

“匿名”是指没有名字的东西。生命周期是与引用相关联的事物。第14行的参考文献在哪里

fn push(&mut self)
//      ^ here
因此,您不必有显式的生命周期,允许它是隐式的(和匿名的)

您的代码要求
Vec
包含
&'a mut Handler
-引用的生存期与生存期
'a
没有已知的关系。错误告诉您这是无效的。您可以通过关联生存期来修复此错误:

fn push(&'a mut self)
然而,这并不能修复整个程序


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


我不知道您为什么想要显示的结构,但是如果我需要它,我可能会切换到处理程序的
Rc
,而不是
&mut

谢谢您提供的信息:)我阅读了大部分内容,但我不知道如何实现它们:顺便问一句,您的意思是什么“我可能会切换到
Rc
而不是
&mut
”?我的代码中有
Rc
!你的意思是仅仅将列表定义为
list:Rc
?我一开始就这样做了,并遇到了这个错误:“self.list.borrow_mut().push(self)^^^预期的结构
处理程序,找到了可变引用你还提到“他们都需要有完全相同的一生”。实际上,我希望处理程序的生命周期比列表短。可能吗?再次感谢。@hadilq我的意思是我不会使用可变引用(
&mut
),而是使用
Rc