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

Mai*_*ein 7 reference cloning rust

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())
    }
}
Run Code Online (Sandbox Code Playgroud)
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>`
Run Code Online (Sandbox Code Playgroud)

为什么会这样?为什么clone返回T而不是T?

现在,如果我自己实现克隆:

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())
    }
}
Run Code Online (Sandbox Code Playgroud)

这有效,但为什么呢?

Eli*_*man 9

您的类型未实现的原因Clonehttps://github.com/rust-lang/rust/issues/26925:派生的Example实现在类型参数上没有正确的边界.尝试显式写入Clone以获取这些行的错误消息.

您收到奇怪错误消息的原因是自动引用规则:编译器看到Clone它没有实现&Example,因此它尝试使用Clone Clone,并且不可变引用始终实现Clone.