gpt4 book ai didi

rust - 什么是 "the anonymous lifetime #1"以及如何以正确的方式定义它?

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

我希望下面的 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 中的这个问题?

最佳答案

What is the "the anonymous lifetime #1"

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

fn push(&mut self)
// ^ here

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

您的代码要求 Vec包含 &'a mut Handler<'a> , 但你正试图输入 &mut Handler<'a> — 引用的生命周期与生命周期没有已知关系 'a .该错误告诉您这是无效的。您可以通过关联生命周期来修复这个错误:

fn push(&'a mut self)

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


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

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

关于rust - 什么是 "the anonymous lifetime #1"以及如何以正确的方式定义它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47477739/

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