Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何专门化特定泛型类型的方法?_Rust - Fatal编程技术网

Rust 如何专门化特定泛型类型的方法?

Rust 如何专门化特定泛型类型的方法?,rust,Rust,我想为非类型化的和单元或基本上每种类型定义方法,但我想专门为单元定义一些方法 问题是Rust在这里不允许两种实现。我使用的是Rust 1.9,我是否需要启用特殊化,或者这是不可能的 use num::Float; // 0.2.1 use std::marker::PhantomData; #[derive(Copy, Clone, Eq, PartialEq)] pub struct Untyped; #[derive(Copy, Clone, Eq, PartialEq)] pub st

我想为
非类型化的
单元
或基本上每种类型定义方法,但我想专门为
单元
定义一些方法

问题是Rust在这里不允许两种实现。我使用的是Rust 1.9,我是否需要启用特殊化,或者这是不可能的

use num::Float; // 0.2.1
use std::marker::PhantomData;

#[derive(Copy, Clone, Eq, PartialEq)]
pub struct Untyped;

#[derive(Copy, Clone, Eq, PartialEq)]
pub struct Unit;

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();
}

您试图专门化在固有的
impl
中定义的方法,而不是专门化在trait中定义的方法。即使在将
default
添加到“非特殊”
length
方法之后,目前似乎也不支持这种方法。提到内在的
impl
s是一个可能的扩展,据我理解,目前还没有考虑实现它

作为一种解决方案,考虑将方法移到一个特性。这需要启用专门化才能工作,因此您需要使用每晚一次的编译器,直到特性稳定为止

我们不是在trait上定义默认实现,而是在general
impl
中定义它。我们需要将
default
上下文关键字添加到该函数中

#![feature(specialization)]

trait VectorExt<T>
where
    T: Float,
{
    fn length(&self) -> T;
}

impl<T, Type> VectorExt<T> for Vector<T, Type>
where
    T: Float,
{
    default fn length(&self) -> T {
        println!("NON SPECIAL");
        T::one()
    }
}

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)
    }
}
#![专题(专门化)]
性状向量
哪里
T:浮动,
{
fn长度(自身)->T;
}
向量的impl vectorent
哪里
T:浮动,
{
默认fn长度(&self)->T{
println!(“非特殊”);
T::一()
}
}
向量的impl vectorent
哪里
T:浮动,
{
fn长度(自身)->T{
println!(“特殊”);
T::一()
}
}
//这个“impl”并不是绝对必要的,
//但它会让你这种类型的用户
//使用“长度”方法
//不必“使用”VectorExt特性。
impl向量
哪里
T:浮动,
{
fn长度(自身)->T
哪里
Self:VectorExt,
{
VectorText:::长度(自身)
//也可以写成:::长度(self)
}
}