从准备数据结构开始,这里有一些非常基本的东西,它适用于许多语言:
1struct MerkelTree {
2 leaves: Vec<MerkelNode>
3}
4
5struct MerkelNode {
6 parent: Option<MerkelNode>,
7 hash: String
8}
struct MerkelNode {
| ^^^^^^^^^^^^^^^^^ recursive type has infinite size
1struct MerkelNode {
2 parent: Option<Box<MerkelNode>>,
3 hash: String
4}
上面的代码可以编译,所以我很高兴开始实现。然而,即使在几个小时后,我仍然不能使我的代码编译… 问题不在于逻辑,问题是我不能用rust能接受的方式表达我想要的东西。
Rust中的每个值都有一个所有者
在同一时间只能有一个所有者
1struct MerkelNode {
2 parent: Option<Box<&MerkelNode>>,
3 hash: String
4}
1struct MerkelNode<'a> {
2 parent: Option<Box<&'a MerkelNode<'a>>>,
3 hash: String
4}
代码看起来有点杂乱,但至少可以编译。接下来让我们继续实现, 又过了几个小时,我又一次得出结论——这是行不通的。
1struct MerkelNode {
2 parent:Option<Rc<MerkelNode>>,
3 hash: String
4}
现在,可以为同一个父节点拥有两个所有者。
1struct MerkelNode {
2 parent: Option<Rc<RefCell<MerkelNode>>>,
3 hash: String
4}