固有因素的方法专业化

时间:2016-06-25 01:17:57

标签: rust

#[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();

我想要的是我想为UntypedUnit或基本上每种类型定义方法,但我想专门为Unit设计一些方法。

问题是Rust真的不喜欢这里有两个实现。现在我正在使用1.9,我是否需要启用专业化,或者这是不可能的?

1 个答案:

答案 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