dot操作
点号操作会有一些神奇的类型转换发生。将auto-referencing,auto-dereferencing和强转直到类型匹配。
有个函数foo
有一个参数(self
, &self
或者&mut self
)。如果调用value.foo
,在调用合适的函数实现之前,编译器需要决定什么类型的Self
.为了更好说明,使用全路径格式:
- 首先,编译器检查是否能直接调用
T::foo(value)
。通过值调用的方式 - 如果不行,那么编译器将auto-reference方式
<&T>::foo(value)
和<&mut T>::foo(value)
. 通过autoref函数调用 - 如果都不行,则使用Deref方式,
T: Deref<Target = U>
将用U替代T尝试。如果不能dereference T那么就尝试unsizing T。例如:[i32; 2]
转换成[i32]