【发布时间】:2016-09-07 05:38:29
【问题描述】:
我尝试做一些更通用的事情,但在尝试关联类型时失败了。 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
【问题讨论】:
-
构建器是否需要参数来初始化新实例,或者它们是否应该可以在没有参数的情况下构造?
-
其实是的——位是某种存根实现——首先要实现从渲染器到返回构建器的转换。您可能已经意识到我在这里尝试创建构建器模式。
-
我认为我的第一条评论措辞不正确。为了构造一个builder,你需要参数吗,还是
ShapeBuilder的每个实现都必须支持不带参数的构造? -
构造将没有参数。
set_origin()的调用将是为构建器设置状态的唯一方法 - 实际呈现的形状的原点
标签: generics rust associated-types