#[derive(Copy, Clone, Eq, PartialEq)]
pub struct Untyped;
#[derive(Copy, Clone, Eq, PartialEq)]
pub struct Unit;
use std::marker::PhantomData;
struct Vector<T, Type>{
data: [T; 3],
_m: PhantomData<Type>
}
impl<T> Vector<T, Unit>
where T: Float{
fn length(&self) -> T{
println!("SPECIAL");
T::one()
}
}
impl<T, Type> Vector<T, Type>
where T: Float{
fn length(&self) -> T{
println!("NON SPECIAL");
T::one()
}
}
fn main(){
let v = Vector::<f32, Untyped>{data: [1., 2., 3.], _m: PhantomData};
let v1 = Vector::<f32, Unit>{data: [1., 2., 3.], _m: PhantomData};
let l = v.length();
let l1 = v1.length();
}
src / vector.rs:236:19:236:25错误:范围内的多个适用项[E0034] src / vector.rs:236 let l1 = v1.length();
我想要的是我想为Untyped
和Unit
或基本上每种类型定义方法,但我想专门为Unit
设计一些方法。
问题是Rust真的不喜欢这里有两个实现。现在我正在使用1.9,我是否需要启用专业化,或者这是不可能的?
答案 0 :(得分:4)
您正在尝试专门化固有$locations = Location::from(DB::raw("(select *,
( 3959 * acos( cos( radians(?) ) *
cos( radians( lat) )
* cos( radians( long ) - radians(?)
) + sin( radians(?) ) *
sin( radians( lat ) ) )
) AS distance from locations) as t"))
->having("distance", "<", $distance)
->orderBy("distance")
->setBindings([$latitude, $longitude, $latitude])
->get();
中定义的方法,而不是专门化特征中定义的方法。即使在将impl
添加到&#34;非特殊&#34;之后,这似乎也不受支持。 default
方法。 RFC 1210提到了固有的length
作为可能的扩展,我理解这一扩展目前尚未考虑实施。
作为解决方法,请考虑将方法移至特征。这需要启用专业化才能工作,因此在功能稳定之前,您需要使用夜间编译器。
impl
我们还可以在常规#![feature(specialization)]
trait VectorExt<T>
where T: Float
{
fn length(&self) -> T {
println!("NON SPECIAL");
T::one()
}
}
impl<T, Type> VectorExt<T> for Vector<T, Type>
where T: Float
{
}
impl<T> VectorExt<T> for Vector<T, Unit>
where T: Float
{
fn length(&self) -> T {
println!("SPECIAL");
T::one()
}
}
// This `impl` is not strictly necessary,
// but it will let users of your type
// use the `length` method
// without having to `use` the `VectorExt` trait.
impl<T, Type> Vector<T, Type>
where T: Float
{
fn length(&self) -> T where Self: VectorExt<T> {
VectorExt::<T>::length(self)
// can also be written as: <Self as VectorExt<T>>::length(self)
}
}
中定义特征,而不是在特征上定义默认实现(如果您需要访问结构的成员)。在这种情况下,我们需要添加impl
上下文关键字。
default