Rust 编译器不期望一个可变引用,而应该期望一个可变引用

Posted

技术标签:

【中文标题】Rust 编译器不期望一个可变引用,而应该期望一个可变引用【英文标题】:Rust compiler does not expect a mutable reference where a mutable reference should be expected 【发布时间】:2019-12-11 11:14:40 【问题描述】:

我们正在编写一个函数来从 Rust 中的排序树中删除一个节点,但遇到了 Rust 编译器抱怨当被调用的函数确实需要可变引用时它不期望可变引用:

error[E0308]: mismatched types
   --> src/tree.rs:111:17
    |
111 |                 SortedContainer::node_find_parent(&mut Some(node), &age, &name)
    |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `std::option::Option`, found mutable reference
    |
    = note: expected type `std::option::Option<std::boxed::Box<tree::Node>>`
               found type `&mut std::option::Option<std::boxed::Box<tree::Node>>`

这是我们在 SortedContainer 的 impl 块中的代码 sn-p(我们的树形结构):

fn node_find_parent<'a>(parent_option: &'a mut Option<Box<Node>>, age: &i32, name: &String) -> &'a mut Option<Box<Node>> 
    // TODO: implement
    parent_option


pub fn find_parent(&mut self, age: &i32, name: &String) -> &mut Option<Box<Node>> 
    &mut match self.root 
        Some(node) => if node.name == *name && node.age == *age 
            self.root
         else 
            SortedContainer::node_find_parent(&mut Some(node), &age, &name)
        
        None => &mut None,
    

SortedContainer::node_find_parent 应该返回一个可变引用,因为返回类型是一个可变引用

我们做错了什么?

【问题讨论】:

很难回答您的问题,因为它不包含minimal reproducible example。我们无法分辨代码中存在哪些 crate(及其版本)、类型、特征、字段等。如果您尝试在Rust Playground 上重现您的错误,如果可能的话,这将使我们更容易为您提供帮助,否则在全新的 Cargo 项目中,然后在edit 您的问题中包含附加信息。您可以使用Rust-specific MRE tips 来减少您在此处发布的原始代码。谢谢! 【参考方案1】:

&amp;mut match 更改为match &amp;mut 解决了问题:

pub fn find_parent(&mut self, age: &i32, name: &String) -> &mut Option<Box<Node>> 
    match &mut self.root 
        Some(node) => 
            if node.name == *name && node.age == *age 
                &mut self.root
             else 
                SortedContainer::node_find_parent(&mut self.root, &age, &name)
            
        
        None => &mut None,
    

【讨论】:

以上是关于Rust 编译器不期望一个可变引用,而应该期望一个可变引用的主要内容,如果未能解决你的问题,请参考以下文章

将 Rust 变量传递给期望能够修改它的 C 函数

如何使 Rust 可变引用不可变?

js 不可变的原始值和可变的对象引用

我是不是应该期望 C++ 编译器会编译具有“按编码”的数据竞争的多线程代码,或者它可能会做其他事情?

rust - 为什么对已删除对象的可变引用仍算作可变引用?

如何在 Rust 中传递对可变数据的引用?