gpt4 book ai didi

rust - 使用Rc >实现二进制搜索树时的生命周期问题

转载 作者:行者123 更新时间:2023-12-03 11:31:24 26 4
gpt4 key购买 nike

我正在使用Rc<RefCell<...>>(Playground)实现二进制搜索树

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

type RcRefBaseNode<T> = Rc<RefCell<BinarySearchTreeNode<T>>>;
type BaseNodeLink<T> = Option<RcRefBaseNode<T>>;

pub struct BinarySearchTreeNode<T: Ord> {
pub data: T,
left: BaseNodeLink<T>,
right: BaseNodeLink<T>,
}

impl <T: Ord> BinarySearchTreeNode<T> {
fn min(&self) -> &T {
self.left.as_ref().map_or(&self.data, |x| x.borrow().min())
}
}
发生错误:
error[E0515]: cannot return value referencing temporary value
--> src/lib.rs:15:51
|
15 | self.left.as_ref().map_or(&self.data, |x| x.borrow().min())
| ----------^^^^^^
| |
| returns a value referencing data owned by the current function
| temporary value created here
如果可能的话,我只想更改 min中的内容,因为我已经为此结构实现了其他方法。
引用: Peek - Learn Rust With Entirely Too Many Linked Lists

最佳答案

我不确定您的主要目标是要树还是要练习Rc或RefCell。
但是,如果您想使用二叉搜索树,我建议您使用向量存储所有节点,并将节点与size_t链接起来,size_t是向量中的索引。
因为使用“指针”构建树数据结构将使您轻松创建圆。节点A,B,A.next = B和B.next =A。使用“指针”是可行的,因此在释放这部分内存时,会造成很多麻烦(Rust编译器不会杀死A,因为B是引用它,反之亦然,可能导致内存泄漏)。您可能还需要选中“弱”以帮助您在安全的环境中解决此问题(对于弱指针,它们不算作真正的“依赖项”,因此A.next和B.next应该是
然后,当A超出范围时,将变弱,它将被释放,并且当您尝试获取指向释放的A)的指针时,B.next将返回None。
如果您确实想使用“指针”方式构建树,则应选中“弱,不安全的 rust ”。
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=9033649a9569b2cba253c4ef6720ca6e
在安全的环境中为您的代码使用Rc和Weak。

关于rust - 使用Rc <RefCell <.. >>实现二进制搜索树时的生命周期问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64760648/

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