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

时间:2016-06-11 15:44:50

标签: reference rust cloning auto-ref

error[E0308]: mismatched types
  --> src/main.rs:27:22
   |
27 |             self.dot(self.clone())
   |                      ^^^^^^^^^^^^ expected struct `Vector`, found reference
   |
   = note: expected type `Vector<T, N>`
              found type `&Vector<T, N>`
clone

为什么会这样?为什么#![feature(type_macros)] extern crate typenum; #[macro_use] extern crate generic_array; extern crate num; use generic_array::*; use num::{Float, Zero}; use typenum::*; 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 max(&self) -> T { self.data .iter() .fold(T::zero(), |acc, &x| if x > acc { x } else { acc }) } 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()) } } 返回&amp; T而不是T?

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

find . -name '*.xlsx' -exec ssconvert -T Gnumeric_stf:stf_csv {} \;

这有效,但为什么?

1 个答案:

答案 0 :(得分:8)

您的类型未实现Clone的原因是https://github.com/rust-lang/rust/issues/26925:派生的Clone实现在类型参数上没有正确的界限。尝试明确编写self.dot(Self::clone(self))以获取这些行的错误消息。

您收到奇怪错误消息的原因是自动引用规则:编译器发现Vector没有实现Clone,因此它尝试使用克隆在&Vector上,不可变引用始终实现Clone。