0

我试图完成一些更通用的事情,但在尝试使用关联类型时失败了。Given 是一个Shape特征和一个Renderer类型,它试图返回Builder一个特定类型的形状。

形状

#[derive(Clone, Copy)]
pub struct Rectangle{
    pub origin: Point,
    pub height: usize,
    pub width: usize,
}

pub trait Shape{
    type Builder : ShapeBuilder;
}

impl Shape for Rectangle{
    type Builder = RectangleBuilder;
}

建设者

pub trait ShapeBuilder{
    type Renderer: ShapeRenderer;
    fn set_origin() -> Self::Renderer;
}

pub struct RectangleBuilder;

impl ShapeBuilder for RectangleBuilder{
    type Renderer = RectangleRenderer;
    fn set_origin() -> Self::Renderer{
        RectangleRenderer
    }
}

渲染器

pub struct Renderer<'a>{
    canvas:&'a mut Canvas
}

impl <'a>Renderer<'a>{
    pub fn new(canvas:&'a mut Canvas) -> Renderer {
        Renderer{
            canvas: canvas
        }
    }
    pub fn set_shape<T: Shape>(&self, shape: T) -> T::Builder{
        // trying to return the specific builder through shape::Builder
        // or something like that
    }
}

我想要实现的是该set_shape方法将返回RectangleBuilder 如果给定shape的类型Rectangle

4

1 回答 1

3

您需要在ShapeBuildertrait 中提供一个静态方法来实例化一个新的Self. 静态方法只是没有self参数的方法。

您可以直接添加方法:

pub trait ShapeBuilder: Sized {
    type Renderer: ShapeRenderer;

    fn new() -> Self;
    fn set_origin() -> Self::Renderer;
}

或者聪明点,定义ShareBuilderDefault.

pub trait ShapeBuilder: Default {
    type Renderer: ShapeRenderer;

    fn set_origin() -> Self::Renderer;
}

然后,在 中set_shape,您可以实例化ShapeBuilder

impl <'a>Renderer<'a>{
    pub fn set_shape<T: Shape>(&self, shape: T) -> T::Builder {
        ShapeBuilder::new() // or Default::default()
    }
}
于 2016-09-07T06:25:27.317 回答