gpt4 book ai didi

带引用的嵌套结构

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

我有一些嵌套结构,无法创建对父结构的反向引用。一个example :

struct Foo<'a> {
parent: &'a Bar<'a>,
}

impl<'a> Foo<'a> {
fn new(parent: &'a Bar) -> Self {
Foo { parent: parent }
}

fn hello_world(&self) -> String {
self.parent.hello().to_owned() + " world"
}
}

struct Bar<'b> {
child: Option<Foo<'b>>,
data: &'static str,
}

impl<'b> Bar<'b> {
fn new() -> Self {
Bar {
child: None,
data: "hello",
}
}

fn hello(&self) -> &str {
self.data
}

fn get_foo(&self) -> Option<&Foo> {
self.child.as_ref()
}
}

fn main() {
let bar = Bar::new();
assert_eq!("hello", bar.hello());
match bar.get_foo() {
Some(foo) => assert_eq!("hello world", foo.hello_world()),
None => (),
}
}

如何替换 NoneSome<Foo>引用Bar ?到目前为止,我不确定这是否可能。

最佳答案

对于您的示例来说,这不完全是一个直接的解决方案,但我相信您可以使用 ArcRwLock 创建您指定的“循环引用”。 API 不完全相同(例如,parent 是一个可选字段),我重命名了一些对象,它肯定更冗长,但你的测试通过了!

use std::sync::{Arc, RwLock};

#[derive(Debug, Clone)]
struct Child {
parent: Option<Arc<RwLock<Parent>>>
}

impl Child {
fn new() -> Self {
Child {
parent: None
}
}

fn hello_world(&self) -> String {
let x = self.parent.as_ref().unwrap().clone();
let y = x.read().unwrap();
y.hello().to_owned() + " world"
}
}

#[derive(Debug, Clone)]
struct Parent {
child: Option<Arc<RwLock<Child>>>,
data: &'static str
}

impl Parent {
fn new() -> Self {
Parent {
child: None,
data: "hello"
}
}

fn hello(&self) -> &str {
self.data
}

fn get_child(&self) -> Option<Arc<RwLock<Child>>> {
self.child.as_ref().map(|x| x.clone() )
}


}

fn main() {
let parent = Arc::new(RwLock::new(Parent::new()));
let child = Arc::new(RwLock::new(Child::new()));

parent.write().unwrap().child = Some(child.clone());
child.write().unwrap().parent = Some(parent.clone());

assert_eq!("hello", parent.read().unwrap().hello());

{
let x = parent.read().unwrap();
match x.get_child() {
Some(child) => { assert_eq!("hello world", child.read().unwrap().hello_world()); }
None => {},
}
}

}

关于带引用的嵌套结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39705896/

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