|
|
@ -189,7 +189,7 @@ fn do_stuff<T: Clone>(value: &T) {
|
|
|
|
let cloned = value.clone();
|
|
|
|
let cloned = value.clone();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
```
|
|
|
|
上面例子中 `cloned` 的类型时什么?首先编译器检查能不能进行**值方法调用**, `value` 的类型是 `&T`,同时 `clone` 方法的签名也是 `&T` : `fn clone(&T) -> T`,因此可以进行值方法调用,再加上编译器知道了 `T` 实现了 `Clone`,因此 `cloned` 的类型是 `T`。
|
|
|
|
上面例子中 `cloned` 的类型是什么?首先编译器检查能不能进行**值方法调用**, `value` 的类型是 `&T`,同时 `clone` 方法的签名也是 `&T` : `fn clone(&T) -> T`,因此可以进行值方法调用,再加上编译器知道了 `T` 实现了 `Clone`,因此 `cloned` 的类型是 `T`。
|
|
|
|
|
|
|
|
|
|
|
|
如果 `T: Clone` 的特征约束被移除呢?
|
|
|
|
如果 `T: Clone` 的特征约束被移除呢?
|
|
|
|
```rust
|
|
|
|
```rust
|
|
|
|