编译器如何推断这个 Box::leak(node).into() 中的类型?

The*_*nda 6 type-inference rust

我试图理解linked_list.rs,我在push_back_node函数 where nodeis a 中遇到了这一行Box

let node = Some(Box::leak(node).into());
Run Code Online (Sandbox Code Playgroud)

Option<NonNull<Node>>>即使没有指定类型,这也会以某种方式产生。这里发生了什么,为什么会起作用?

SCa*_*lla 8

几乎所有的类型都由被调用的函数决定。唯一棘手的是into调用。

如果t有类型T,则Some(t)是类型Option<T>。如果bx有类型Box<T>,则Box::leak(bx)有类型&mut Tinto使用任何可用信息(在合理范围内)来确定输入类型和预期输出类型,并使用Into特征来确定转换是否可能。

所以因为node(在重新绑定之前)有 type Box<Node<T>>Box::leak(node)有 type &mut Node<T>。的into某种类型的转换U来确定,并且Some在一个选择为类型包裹Option<U>

然而,这并不是我们所知道的全部。稍后push_back_node,我们有线路self.head = node。这将 new 的类型node(我们说是Option<U>针对某种类型的U)限制为与self.head. self.head已知有类型Option<NonNull<Node<T>>>,所以U必须是NonNull<Node<T>>

所以into调用必须从 转换&mut Node<T>NonNull<Node<T>>。检查是否有Into<NonNull<Node<T>>>for &mut Node<T>...的实现,并且有!如果U工具From<T>然后T自动(通过毯impl)工具Into<U>,并有一个执行From<&mut T>NonNull<T>


有关更多信息(以及编译器如何考虑这一点的更精确概述),请查看开发指南中关于类型推断的章节和下一章关于特征求解的章节rustc