为何Rust编译器推断出非预期类型?技术咨询
这不是编译器缺陷,是类型推断的正常行为
类型推导逻辑拆解
node.left的类型是Option<Box<Node>>,执行if let Some(n) = &node.left匹配后,n的类型是&Box<Node>。- 对于
&*n,编译器有两种可能的解读:- 直接推导:对
n(&Box<Node>)解引用得到Box<Node>,再取引用得到&Box<Node>——无额外上下文约束时,编译器会优先选择这种最直接的类型。 - 隐式 Deref 转换:利用
Box<Node>实现的Deref<Target=Node>特性,自动将Box<Node>解引用为Node,再取引用得到&Node——但这需要明确的上下文类型要求才会触发。
- 直接推导:对
为什么显式指定类型能编译
当你没有给 childrens 指定类型时,编译器只能根据 push_back(&*n) 的直接推导结果,将其推断为 VecDeque<&Box<Node>>,但后续调用 traverse 时,函数期望的参数是 &mut VecDeque<&Node>,类型不匹配导致报错。
而显式声明 childrens: VecDeque<&Node> 后,编译器会自动触发隐式转换:将 &Box<Node> 转换为 &Node(因为 &Box<T> 可以隐式转换为 &T),因此代码可以正常编译。
替代写法(无需显式指定类型)
你也可以通过调整 push_back 的写法,引导编译器自动推断出正确类型:
// 写法1:利用 AsRef 特性 childrens.push_back(n.as_ref()); // 写法2:显式两次解引用 childrens.push_back(&**n);
内容的提问来源于stack exchange,提问作者sunboy_zgz
相关产品推荐
相关产品推荐

