我正在用Rust编写一棵树,我想实现一个函数:left,它可以将树的根转换为树的根的左子对象. 以下是我的代码:

struct Node {
    value: i32,
    left: Option<Box<Node>>,
    right: Option<Box<Node>>,
}

struct Tree {
    root: Option<Box<Node>>,
}

enum Error {
    DuplicateValue,
    NotFound,
    EmptyTree
}

impl Tree {
    fn left(&mut self) -> Result<(), Error> {
        match self.root {
            Option::None => return Err(Error::EmptyTree),
            Option::Some(ref mut node) => {
                *node = node.left.as_ref().unwrap();
                return Ok(())
            }
        }
    }
}

错误是说

mismatched types
expected struct `Box<Node>`
found reference `&Box<Node>`

我try 了很多方法,查阅了很多信息,但我仍然无法修复这个问题.我认为这在C中是非常简单的事情,就像:

*root = *(root->left);

但为什么在铁 rust 地区这么难呢?有谁可以帮我?

推荐答案

由于您的代码在调用left时看起来会丢弃整个右分支和根 node ,即您不关心原始根(它将在赋值后被丢弃),因此您只需将Option中的左 node take:

impl Tree {
    fn left(&mut self) -> Result<(), Error> {
        match self.root {
            Option::None => Err(Error::EmptyTree),
            Option::Some(ref mut node) => {
                *node = node.left.take().unwrap();
                Ok(())
            }
        }
    }
}

Playground

但是,请注意,如果左子树为空,则会出现panic .在本例中,如果希望将self置空,则需要替换整个Option,而不是其中的值.在这种情况下,您必须首先进行匹配,在空箱中提早返回,然后在不再borrow root之后才进行替换:

impl Tree {
    fn left(&mut self) -> Result<(), Error> {
        let node = match self.root {
            Option::None => return Err(Error::EmptyTree),
            Option::Some(ref mut node) => node.left.take(),
        };
        self.root = node;
        Ok(())
    }
}

Rust相关问答推荐

计算具有相邻调换且没有插入或删除的序列的距离

什么样的 struct 可以避免使用RefCell?

这种获取-释放关系是如何运作的?

为什么reqwest以文本形式下载二进制文件?

在Rust中,在实现特征`Display`时,如何获取调用方指定的格式?

在Rust中显式装箱受生存期限制的转换闭包

在UdpSocket上使用sendto时的隐式套接字绑定

如何在 struct 的自定义序列化程序中使用serde序列化_WITH

我可以在不收集或克隆的情况下,将一个带有Item=(key,val)的迭代器拆分成单独的key iter和val iter吗?

rust中的库插件管理器,现在是否可行?

如何轮询 Pin>?

Rust中的标记特征是什么?

Rust 中 `Option` 的内存开销不是常量

如何存储返回 Future 的闭包列表并在 Rust 中的线程之间共享它?

如何异步记忆选项中的 struct 字段

从函数返回 u32 的数组/切片

如何为枚举中的单个或多个值返回迭代器

为什么我不能为 Display+Debug 的泛型类型实现 std::error::Error 但有一个不是泛型参数的类型?

如何在 Rust 中构建一个 str

令人困惑的错误消息? (解包运算符)