#![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错误:不匹配的类型[E0308] src / main.rs:41返回self.dot(self.clone()); ^ ~~~~~~~~~~~ src / main.rs:41:25:41:37求助:运行rustc - 解释E0308详细说明src / main.rs:41:25:41: 37注意:预期类型Vector <T,N> src / main.rs:41:25:41:37注意:找到类型&Vector <T,N>
为什么会这样?为什么 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());
}
}
这有效,但为什么呢?
1 回答
您的类型未实现
Clone
的原因是https://github.com/rust-lang/rust/issues/26925:派生的Clone
实现在类型参数上没有正确的边界 . 尝试显式编写self.dot(Self::clone(self))
以获取这些行的错误消息 .您收到奇怪错误消息的原因是自动引用规则:编译器发现
Vector
没有实现Clone
,因此它尝试在&Vector
上使用Clone,并且不可变引用始终实现Clone .