|
|
|
@ -174,7 +174,7 @@ error[E0277]: the trait bound `&mut i32: Trait` is not satisfied
|
|
|
|
|
1. 首先,编译器检查它是否可以直接调用 `T::foo(value)`,称之为**值方法调用**
|
|
|
|
|
2. 如果上一步调用无法完成(例如方法类型错误或者特征没有针对 `Self` 进行实现,上文提到过特征不能进行强制转换),那么编译器会尝试增加自动引用,例如会尝试以下调用: `<&T>::foo(value)` 和 `<&mut T>::foo(value)`,称之为**引用方法调用**
|
|
|
|
|
3. 若上面两个方法依然不工作,编译器会试着解引用 `T` ,然后再进行尝试。这里使用了 `Deref` 特征 —— 若 `T: Deref<Target = U>` (`T` 可以被解引用为 `U`),那么编译器会使用 `U` 类型进行尝试,称之为**解引用方法调用**
|
|
|
|
|
4. 若 `T` 不能被解引用,且 `T` 是一个定长类型(在编译器类型长度是已知的),那么编译器也会尝试将 `T` 从定长类型转为不定长类型,例如将 `[i32; 2]` 转为 `[i32]`
|
|
|
|
|
4. 若 `T` 不能被解引用,且 `T` 是一个定长类型(在编译期类型长度是已知的),那么编译器也会尝试将 `T` 从定长类型转为不定长类型,例如将 `[i32; 2]` 转为 `[i32]`
|
|
|
|
|
5. 若还是不行,那...没有那了,最后编译器大喊一声:汝欺我甚,不干了!
|
|
|
|
|
|
|
|
|
|
下面我们来用一个例子来解释上面的方法查找算法:
|
|
|
|
|