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】:将&mut match
更改为match &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 编译器不期望一个可变引用,而应该期望一个可变引用的主要内容,如果未能解决你的问题,请参考以下文章