为什么克隆我的自定义类型会导致 &T 而不是 T?

Why does cloning my custom type result in &T instead of T?

use generic_array::*; // 0.12.3
use num::{Float, Zero}; // 0.2.0

#[derive(Clone, Debug)]
struct Vector<T, N: ArrayLength<T>> {
    data: GenericArray<T, N>,
}

impl<T, N: ArrayLength<T>> Vector<T, N>
where
    T: Float + Zero,
{
    fn dot(&self, other: Self) -> T {
        self.data
            .iter()
            .zip(other.data.iter())
            .fold(T::zero(), |acc, x| acc + *x.0 * *x.1)
    }

    fn length_sq(&self) -> T {
        self.dot(self.clone())
    }
}
error[E0308]: mismatched types
  --> src/lib.rs:21:18
   |
21 |         self.dot(self.clone())
   |                  ^^^^^^^^^^^^ expected struct `Vector`, found reference
   |
   = note: expected type `Vector<T, N>`
              found type `&Vector<T, N>`

为什么会这样?为什么 clone return &T 而不是 T

如果我自己实施 Clone 为什么会这样?

use generic_array::*; // 0.12.3
use num::{Float, Zero}; // 0.2.0

#[derive(Debug)]
struct Vector<T, N: ArrayLength<T>> {
    data: GenericArray<T, N>,
}

impl<T: Float, N: ArrayLength<T>> Clone for Vector<T, N> {
    fn clone(&self) -> Self {
        Vector::<T, N> {
            data: self.data.clone(),
        }
    }
}

impl<T, N: ArrayLength<T>> Vector<T, N>
where
    T: Float + Zero,
{
    fn dot(&self, other: Self) -> T {
        self.data
            .iter()
            .zip(other.data.iter())
            .fold(T::zero(), |acc, x| acc + *x.0 * *x.1)
    }

    fn length_sq(&self) -> T {
        self.dot(self.clone())
    }
}

当您的类型未实现时会出现此错误 Clone:

struct Example;

fn by_value(_: Example) {}

fn by_reference(v: &Example) {
    by_value(v.clone())
}
error[E0308]: mismatched types
 --> src/lib.rs:6:14
  |
6 |     by_value(v.clone())
  |              ^^^^^^^^^ expected struct `Example`, found &Example
  |
  = note: expected type `Example`
             found type `&Example`

这是由于自动引用规则:编译器发现 Example 没有实现 Clone,因此它尝试在 [=16= 上使用 Clone ],不可变引用总是实现 Clone.

您的 Vector 类型未实现 Clone 的原因是 the derived Clone implementation doesn't have the right bounds on the type parameters (Rust issue #26925)。尝试显式写入 self.dot(Self::clone(self)) 以按照这些行获取错误消息。

另请参阅: