2016-06-11 12 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))を明示的に記述して、これらの行に沿ってエラーメッセージを取得してください。

あなたは奇妙なエラーメッセージを取得している理由は、自動参照のルールです:コンパイラはVectorCloneを実装していないことを見て、そうではなく&Vectorにクローンを使用し、不変の参照は常にクローンを実装しようとします。

関連する問題