#![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 typeVector<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());
}
}
を実装する場合
は今、これは動作しますが、なぜですか?