Trait `x` is not implemented for the type `x`

前端 未结 3 1430
我在风中等你
我在风中等你 2021-01-17 21:21

When compiling the following code:

trait RenderTarget {}

struct RenderWindow;
impl RenderTarget for RenderWindow {}

trait Drawable {
    fn draw

        
3条回答
  •  無奈伤痛
    2021-01-17 21:42

    If you're stuck with what you're given, there are two options you could try.

    In this case, you can't, but if you were given an unsized RenderTarget

    trait Drawable {
        fn draw(&self, target: &mut RT);
    }
    

    you could implement

    trait DrawableDynamic {
        fn draw(&self, target: &mut RenderTarget);
    }
    
    impl DrawableDynamic for T {
        fn draw(&self, target: &mut RenderTarget) {
            Drawable::draw(self, target)
        }
    }
    

    to redirect the types you're given to an object-safe dynamically dispatched alternative. It looks like such a change could be made upstream, since you can't really use the fact that RT is sized.

    The other doesn't allow you to put arbitrary Drawables in your Vec, but should work without allowing unsized types upstream. This is to use an enum to wrap the possible values of the vector:

    enum AllDrawable {
        Square(Square),
        Triangle(Triangle)
    }
    
    impl Drawable for AllDrawable {
        fn draw(&self, target: &mut RT) {
            match *self { 
                AllDrawable::Square(ref x) => x.draw(target),
                AllDrawable::Triangle(ref x) => x.draw(target),
            }
        }
    }
    

    One might want to add From implementations and such; you might find it easier if using wrapped_enum! which will automatically implement those for you.

提交回复
热议问题