【发布时间】:2018-08-11 04:19:33
【问题描述】:
我查看了很多主题,但我找不到任何关于为什么我的代码无法编译的线索(当然所有权问题除外),希望这里有人可以帮助我。
我正在研究二叉树的实现,它的功能之一是 insert 功能。这是我第一次在 Rust 中编码,虽然我已经多次查看文档,但我无法弄清楚以下代码中的所有权有什么问题(我只发布了所有相关代码):
#[derive(Debug)]
struct Data {
name: String,
age: i32,
}
#[derive(Debug)]
struct Node {
value: Data,
left: Option<Box<Node>>,
right: Option<Box<Node>>,
}
pub struct SortedContainer {
root: Option<Box<Node>>,
}
impl SortedContainer {
pub fn insert(&mut self, name: String, age: i32) {
let d = Data {
name: name,
age: age,
};
let n = Node {
value: d,
left: None,
right: None,
};
match self.root {
Some(ref rootnode) => SortedContainer::node_insert(n, *rootnode),
None => self.root = Some(Box::new(n)),
}
}
fn node_insert(n: Node, mut n2: Box<Node>) {
let i = SortedContainer::data_compare(&n.value, &n2.value);
if i < 0 {
match n2.right {
Some(ref rightnode) => SortedContainer::node_insert(n, *rightnode),
None => n2.right = Some(Box::new(n)),
}
} else if i > 0 {
match n2.left {
Some(ref leftnode) => SortedContainer::node_insert(n, *leftnode),
None => n2.left = Some(Box::new(n)),
}
}
}
fn data_compare(d: &Data, d2: &Data) -> i32 {
if d.age < d2.age {
return -1;
} else if d.age > d2.age {
return 1;
} else if d.name == d2.name {
return 0;
} else if d.name > d2.name {
return 1;
} else if d.name < d2.name {
return -1;
} else {
return 0;
}
}
}
终端提供的错误是:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:31:67
|
31 | Some(ref rootnode) => SortedContainer::node_insert(n, *rootnode),
| ^^^^^^^^^ cannot move out of borrowed content
error[E0507]: cannot move out of borrowed content
--> src/main.rs:39:72
|
39 | Some(ref rightnode) => SortedContainer::node_insert(n, *rightnode),
| ^^^^^^^^^^ cannot move out of borrowed content
error[E0507]: cannot move out of borrowed content
--> src/main.rs:44:71
|
44 | Some(ref leftnode) => SortedContainer::node_insert(n, *leftnode),
| ^^^^^^^^^ cannot move out of borrowed content
是否与Box 或左/右分配有关?
【问题讨论】:
-
第一次用 Rust 编码 -- 你应该从别的地方开始
-
我强烈建议为
Data实现Ord而不是您自己的定制函数。 -
我还没有找到这个特性,谢谢!
标签: rust binary-tree ownership