- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
>, left: Opti-6ren">
我正在尝试用 Rust 实现 BST。我的结构看起来像这样:
pub struct Node<T> {
key: T,
parent: Option<Box<Node<T>>>,
left: Option<Box<Node<T>>>,
right: Option<Box<Node<T>>>,
}
我正在研究一种寻找当前节点后继者的方法。在与借用检查器进行了长时间的斗争之后,我成功了,但现在看起来像这样:
//If right node exists - successor is a min node in it.
//Else - go up a parent node. If parent is None, no successor.
//If origin was parent's left node - parent is a successor.
//Else - go up another level.
pub fn succ(&self) -> Option<Box<Node<T>>> {
match self.right {
Some(ref node) => Some(node.min()),
None => {
let mut origin = Box::new(self.clone()); //To match types
let mut parent = origin.parent.clone(); //`Node<T>` not a copy type
loop {
let parent_node = match parent.clone() {
Some(node) => node,
None => break,
};
let right_of_parent = match parent_node.clone().right {
Some(node) => node,
None => break,
};
if *origin != *right_of_parent {
break;
}
origin = parent_node;
parent = origin.parent.clone();
}
parent
}
}
}
如果我删除所有 .clone()
,编译器将开始报错“部分移动值”和“无法分配因为借用”错误。有没有办法让这段代码更加地道,而不是克隆 hell ?
更新:
想发布我最终得到的解决方案。
首先,上面的代码不起作用,因为父字段包含的不是引用,而是父节点的副本。所以最后问题变成了“如何实现对父节点的引用”。
我考虑了下面的答案,一些books和 relevant answers最后我得出结论,对于一个我什至不打算在线发布的玩具项目来说,它不值得。我发现不是最有效但绝对更简单的解决方案 - 根本不使用父引用。
我从上面的结构中删除了父字段并创建了另一个结构:
pub struct Tree<T> {
root: Option<Box<Node<T>>>,
}
现在我从树的根部搜索父节点。我的 succ
函数现在看起来像这样:
fn succ<'a>(&'a self, node: &'a Node<T>) -> Option<&Node<T>> {
match node.right {
Some(ref rnode) => rnode.min(),
None => {
let mut succ = None;
let mut root = self.root.as_ref();
loop {
root = match root {
Some(ref rootnode) => {
match node.key.cmp(&rootnode.key) {
Ordering::Less => {
succ = Some(&***rootnode);
rootnode.left.as_ref()
}
Ordering::Greater => rootnode.right.as_ref(),
Ordering::Equal => break,
}
}
None => break,
}
}
succ
}
}
}
最佳答案
欢迎使用 Rust 和 Stack Overflow!
这里的主要问题是 Node
定义:
pub struct Node<T> {
key: T,
parent: Option<Box<Node<T>>>,
left: Option<Box<Node<T>>>,
right: Option<Box<Node<T>>>,
}
在 Rust 中,Box<T>
拥有 值而不是可以别名的指针。您将无法创建任何非平凡的树。
而不是 Box
,你可以试试引用计数 Rc<T>
.您可以使用 Weak
父链接的指针,以避免让它们保持事件状态:
use std::rc::{Rc,Weak};
pub struct Node<T> {
key: T,
parent: Option<Weak<Node<T>>>,
left: Option<Rc<Node<T>>>,
right: Option<Rc<Node<T>>>,
}
排序后,您就不会使用引用。每次你做这样的事情:
let mut parent = origin.parent; //.clone();
在你的版本中 origin.parent
类型为 Option<Box<Node<T>>>
,您正在尝试移动 Option
场外origin
- 因此你必须添加 clone()
(它克隆了 Box
中的节点,而不仅仅是指针!)。但是,您并不是真的想搬出去;您只需要对它的引用,例如:
let parent = &origin.parent;
或者执行 None
同时检查:
match origin.parent {
Some(ref parent_ptr) => { ... },
None => { ... }
}
希望对您有所帮助!
关于rust - 搜索BST节点的Successor, "clone to satisfy borrow checker"灾难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39072257/
我正在为 Windows 应用程序编写 DLL 插件,添加以下内容后包括: #include #include 我得到一个奇妙的编译错误: Error 3 error C2143: syntax
这让我有点疯狂.. 下面是迄今为止我的程序的屏幕截图。 右边是一个 NSTableView(基于 View )。用户可以在此处选择他们想要处理的文档。 左边是 NSTextView。文本的显示取决于他
当我在 Google 上搜索我们的网站时,我发现显示了三个内容相同的网站。我一直以为我们只使用一个站点 www.foo.com,但事实证明我们有 www.foo.net 和 www.foo.info,
昨天我遇到了痛苦,这让我沮丧了 24 小时。问题归结为随机发生的意外崩溃。使事情复杂化的是,调试报告也具有绝对随机 模式。更复杂的是,所有调试跟踪都指向随机 Qt 源或 native DLL,即每次都
在我们与业务层断开连接并通过 MVC Web API 进行通信的 Winforms 客户端应用程序中,我们收到了一个严重的错误。哪位高手能解释一下! 这是什么意思呢? ---> (Inner Exce
我是一名前端开发人员,我正在使用 react-admin 开发一个网络应用程序元素。 代码很好,没有错误。我启动应用程序。起初它看起来像它应该的样子。一些带有表格、菜单栏等的组件。但是,在单击几下之后
我一直在研究如何使 Bootstrap 与 IE 8 一起工作,但它仍然看起来像这样: 到目前为止我做了什么: 插入 插入 respond.js -> 但还是一样。问题是子域吗?还是我的 IE 8
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关于您编写的代码问题的问题必须在问题本身中描述具体问题 — 并且包括有效代码 以重现它。参见 SSC
我刚刚更改了所有代码以使用 __autoload,发现它与 joomla 自动加载器冲突。在某些情况下,我将我的应用程序与 joomla 集成以注册用户等。 我发现 spl_autoload_regi
无法在任何地方得到任何爱,这很难相信。 NetStream 上的实时流和缓冲区不混合。为什么?文档并没有说你不能这样做。 播放被灌输。缓冲区应该填充到您在播放前设置的内容。但是,大约有一半的时间,播放
我正在尝试用 Rust 实现 BST。我的结构看起来像这样: pub struct Node { key: T, parent: Option>>, left: Opti
目标: json_encode 具有私有(private)属性的 PHP 对象 通过 Low Level AJAX 将编码后的对象作为数据字符串发送使用 jQuery json_decode 请求发送
我花了很多时间在网页上工作,并且懒得将东西提交给 Git。今天,我试图将所有内容推送到我的 repo 协议(protocol),但我认为我可能造成了灾难。我是 Git 的新手,基本上只是将它用于最基本
我是一名优秀的程序员,十分优秀!