基本需求就是这样,A结构体包含B结构体,B结构体也要包含A结构体的引用,以访问其它成员,示例代码大致如下,怎么也改不对,DeepSeek也没能帮我改对,报错和生命周期相关,求助:
use std::rc::{Rc,Weak};
use std::cell::RefCell;
trait TestTrait<'a> {
fn test_func(&mut self, parent: Option<Weak<RefCell<&'a dyn TestTrait<'a>>>>) -> bool;
fn get_string(&self) -> String;
}
struct Test1<'a> {
str: String,
test2: Test2<'a>
}
struct Test2<'a> {
parent: Option<Weak<RefCell<&'a dyn TestTrait<'a>>>>
}
impl<'a> Default for Test2<'a> {
fn default() -> Self {
Test2{parent:None}
}
}
impl<'a> TestTrait<'a> for Test2<'a> {
fn test_func(&mut self, parent: Option<Weak<RefCell<&'a dyn TestTrait<'a>>>>) -> bool {
self.parent = parent; //在这个地方怎么也过不去
false
}
fn get_string(&self) -> String {
if let Some(ref t2) = self.parent {
if let Some(rc) = t2.upgrade() {
let b = rc.borrow();
return b.get_string();
}
}
"".to_string()
}
}
impl<'a> Default for Test1<'a> {
fn default() -> Self {
Test1{
str:"Test1".to_string(),
test2: Test2::default()
}
}
}
impl<'a> TestTrait<'a> for Test1<'a> {
fn test_func(&mut self, parent: Option<Weak<RefCell<&'a dyn TestTrait<'a>>>>) -> bool {
let rc_self = Rc::new(RefCell::new(self as &dyn TestTrait<'a>));
let weak_self = Rc::downgrade(&rc_self);
self.test2.test_func(Some(weak_self));
false
}
fn get_string(&self) -> String {
self.test2.get_string();
self.str.clone()
}
}
fn main() {
let mut test1 = Test1::default();
test1.test_func(None);
println!("{}", test1.get_string());
}
1
共 9 条评论, 1 页
评论区
写评论使用clone()呢?
我单从技术(trick)的角度帮你修复一下编译器不通过的问题🤭 -- 直接截断编译器对week_self的引用溯源:
这 这不对吧(鸡汤状)
问题好像也不在你说的地方:
上面这段逻辑上是没有问题的,编译器不通过的地方在这里:
这地方有两个问题:一是
test_func
需要&mut self
,但是week_self
已经拥有&self
了;第二个就是,&mut self
没有显式标注生命周期就是临时生命周期,所以week_self
也会限制在该临时生命周期,无法满足test_func
里'a
的要求谢谢,你这个高级啊,只是,我的水平还用不了这个
--
👇
Bai-Jinlin: 自引用需要用Pin来实现,我这里用了pinned_init库进行原地构造,你可以参考下我的实现。
解析的时候地确是可以,但现在的问题是,我要把它解成数据结构,然后,xml文件就不再需要了
--
👇
asuper: 栈溢出是因为两个结构反复调用
get_string()
,类似于递归没有写退出条件,可以限制一下调用深度。从你的需求来讲,也可以通过操作path,再去xml中索引的方式来取父节点。
栈溢出是因为两个结构反复调用
get_string()
,类似于递归没有写退出条件,可以限制一下调用深度。从你的需求来讲,也可以通过操作path,再去xml中索引的方式来取父节点。
谢谢,的确是溢出了。我的本来需求跟这个类似,这是我的一个简化验证版本。我的事实上应用是,解析一个xml描述的数据结构,每一个层级对应一个数据结构,然后,因为一些孩子结构可能需要用到父结构甚至是祖先结构里面的内容,所以,我需要子结构中拿到父结构,所以就有了这么一个需求。
--
👇
ThinkCodeStudio: 我不知道你这段代码的真实目的, 我修改后的代码可以运行了, 但是程序出现了栈溢出, 在我注释的地方程序陷入了死循环.
自引用需要用Pin来实现,我这里用了pinned_init库进行原地构造,你可以参考下我的实现。
我不知道你这段代码的真实目的, 我修改后的代码可以运行了, 但是程序出现了栈溢出, 在我注释的地方程序陷入了死循环.