2016-06-11 56 views
3
#![feature(type_macros)] 
extern crate typenum; 
#[macro_use] 
extern crate generic_array; 
extern crate num; 
use num::{Float, Zero}; 
use typenum::*; 
use generic_array::*; 

#[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{ 
     return self.data.iter().zip(other.data.iter()) 
           .fold(T::zero(), |acc, x|{ 
      return acc + *x.0 * *x.1; 
     }); 
    } 

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

src/main.rs:41:25: 41:37 error: mismatched types [E0308] src/main.rs:41 return self.dot(self.clone()); ^~~~~~~~~~~~ src/main.rs:41:25: 41:37 help: run rustc --explain E0308 to see a detailed explanation src/main.rs:41:25: 41:37 note: expected type Vector<T, N> src/main.rs:41:25: 41:37 note: found type &Vector<T, N>为什么克隆我的自定义类型导致&T而不是T?

为什么会发生这种情况?为什么clone返回& T而不是T?

现在,如果我实现了自己的克隆

#![feature(type_macros)] 
extern crate typenum; 
#[macro_use] 
extern crate generic_array; 
extern crate num; 
use num::{Float, Zero}; 
use typenum::*; 
use generic_array::*; 

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{ 
     return Vector::<T, N>{data: self.data.clone()}; 
    } 
} 

impl<T, N: ArrayLength<T>> Vector<T, N> 
where T: Float + Zero { 
    fn max(&self) -> T{ 
     return self.data.iter().fold(T::zero(), |acc, &x|{ 
      if x > acc { 
       return x; 
      } 
      else{ 
       return acc; 
      } 
     }); 
    } 

    fn dot(&self, other: Self) -> T{ 
     return self.data.iter().zip(other.data.iter()) 
           .fold(T::zero(), |acc, x|{ 
      return acc + *x.0 * *x.1; 
     }); 
    } 

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

这工作,但为什么呢?

回答

6

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

你得到奇怪的错误消息的原因是自动裁判规则:编译器看到的是Vector没有实现Clone,所以它,而不是试图在&Vector使用克隆,和不可改变的引用始终贯彻克隆。