Generics 用返回泛型特征的方法实现特征

Generics 用返回泛型特征的方法实现特征,generics,rust,traits,Generics,Rust,Traits,我试图设计一对特征(例如线性代数中的RowVector和ColumnVector),其中每个特征从其方法之一返回另一个(例如转置)。我希望将来能够添加这两种特性的实现(例如密集和稀疏向量实现) 我没有将VecColumnVector作为ColumnVector的子类型吗?或者我是否需要告诉特质,它不需要是一个静态的生命周期?您正在尝试返回一个特质。虽然这是可能的使用,但它可能不是你想要做的。一个更好的设计是引入一个转置特性,你可以用类似于Rust内置的从和转换为转换特性的方式对其进行建模 tra

我试图设计一对特征(例如线性代数中的
RowVector
ColumnVector
),其中每个特征从其方法之一返回另一个(例如
转置
)。我希望将来能够添加这两种特性的实现(例如密集和稀疏向量实现)


我没有将
VecColumnVector
作为
ColumnVector
的子类型吗?或者我是否需要告诉特质,它不需要是一个
静态的
生命周期?

您正在尝试返回一个特质。虽然这是可能的使用,但它可能不是你想要做的。一个更好的设计是引入一个
转置
特性,你可以用类似于Rust内置的
转换为
转换特性的方式对其进行建模

trait Transpose<To> {
    fn transpose(self) -> To;
}

impl<Element> Transpose<VecColumnVector<Element>> for VecRowVector<Element> {
    fn transpose(self) -> VecColumnVector<Element> {
        VecColumnVector::new(self.vec)
    }
}

impl<Element> Transpose<VecRowVector<Element>> for VecColumnVector<Element> {
    fn transpose(self) -> VecRowVector<Element> {
        VecRowVector::new(self.vec)
    }
}
trait转置{
fn转置(自身)->To;
}
VecRowVector的impl转置{
fn转置(自身)->VecColumnVector{
VecColumnVector::新建(self.vec)
}
}
向量的impl转置{
fn转置(自)->VecRowVector{
VecRowVector::新建(self.vec)
}
}

当两种类型需要关联时,最好的解决方案通常是。这就排除了像trait对象那样使用动态分派,但是动态分派在Rust中仍然非常有限。Rust在静态分派中更具表现力,关联类型利用了静态分派

pub trait RowVector<Element>: Sized {
    type Transpose: ColumnVector<Element>;

    fn transpose(self) -> Self::Transpose;
}

pub trait ColumnVector<Element>: Sized {
    type Transpose: RowVector<Element>;

    fn transpose(self) -> Self::Transpose;
}

pub struct VecRowVector<Element> {
    pub vec: Vec<Element>
}

pub struct VecColumnVector<Element> {
    pub vec: Vec<Element>
}

impl<Element> RowVector<Element> for VecRowVector<Element> {
    type Transpose = VecColumnVector<Element>;

    fn transpose(self) -> VecColumnVector<Element> {
        VecColumnVector { vec: self.vec }
    }
}

impl<E: Debug> ColumnVector<Element> for VecColumnVector<Element> {
    type Transpose = VecRowVector<Element>;

    fn transpose(self) -> VecRowVector<Element> {
        VecRowVector { vec: self.vec }
    }
}
pub trait行向量:大小{
类型转置:列向量;
fn转座酶(self)->self::转座酶;
}
发布特征列向量:大小{
类型转置:行向量;
fn转座酶(self)->self::转座酶;
}
pub结构向量{
发布vec:vec
}
pub结构向量{
发布vec:vec
}
VecRowVector的impl RowVector{
类型转置=向量;
fn转置(自身)->VecColumnVector{
VecColumnVector{vec:self.vec}
}
}
VecColumnVector的impl ColumnVector{
类型转置=矢量;
fn转置(自)->VecRowVector{
VecRowVector{vec:self.vec}
}
}

如何更新
行向量
列向量
特征,以指示实现它们的每个结构也必须实现相应的
转置
?我认为这将变得相当复杂:每个特征上的约束之间都会有循环引用,因为您必须严格成对地定义IMPL,这很难用Rust表示。一个更简单(更灵活)的设计是不对类型本身施加任何约束,而是在使用类型的地方施加约束。因此,我无法编写像
f(r:&RowVector,c:&ColumnVector)
这样的函数,并且希望能够在主体中使用
转置
?我必须列出
转置
以及我需要的其他线性代数运算?我肯定有办法,但我无法直接看到它,可能需要先进行一些重构。这感觉就像你在尝试一个类似Java的范例——用特性代替接口——而这与人们在Rust中编程的方式并不完全相符。
pub trait RowVector<Element>: Sized {
    type Transpose: ColumnVector<Element>;

    fn transpose(self) -> Self::Transpose;
}

pub trait ColumnVector<Element>: Sized {
    type Transpose: RowVector<Element>;

    fn transpose(self) -> Self::Transpose;
}

pub struct VecRowVector<Element> {
    pub vec: Vec<Element>
}

pub struct VecColumnVector<Element> {
    pub vec: Vec<Element>
}

impl<Element> RowVector<Element> for VecRowVector<Element> {
    type Transpose = VecColumnVector<Element>;

    fn transpose(self) -> VecColumnVector<Element> {
        VecColumnVector { vec: self.vec }
    }
}

impl<E: Debug> ColumnVector<Element> for VecColumnVector<Element> {
    type Transpose = VecRowVector<Element>;

    fn transpose(self) -> VecRowVector<Element> {
        VecRowVector { vec: self.vec }
    }
}