调用sprite :: Scene :: draw时输入不匹配

时间:2017-08-10 21:54:40

标签: rust rust-piston

我正在使用Piston和Sprite开展个人项目。 example code调用此方法:

scene.draw(c.transform, g);

我正在尝试调用一种方法来绘制所有内容。 我第一次尝试:

draw<G: Graphics>(&self, c: &Context, g: &mut G, scene: &mut Scene)

然后编译器告诉我需要给Scene一个类型参数,所以我尝试了这个:

draw<G: Graphics, S>(&self, c: &Context, g: &mut G, scene: &mut Scene<S>)

然后编译器告诉我类型需要实现trait ImageSize所以我试过这个:

draw<G: Graphics, S: ImageSize>(&self, c: &Context, g: &mut G, scene: &mut Scene<S>)

然后我收到了这个错误:

error[E0271]: type mismatch resolving `<G as graphics::Graphics>::Texture == S`
  --> src/game.rs:38:15
   |
38 |         scene.draw(c.transform, g);
   |               ^^^^ expected associated type, found type parameter
   |
   = note: expected type `<G as graphics::Graphics>::Texture`
          found type `S`

我不明白编译器在这里要说的是什么。完整类型Scenesprite::Scene<piston_window::Texture<gfx_device_gl::Resources>> 但是我不想在方法的签名中写出来。

我有两个问题:

  1. 编译器试图告诉我什么?
  2. 如何将场景传递给方法?

1 个答案:

答案 0 :(得分:1)

<streambuf>的定义是:

draw

用语言来说,这大致相当于:

使用实现impl<I: ImageSize> Scene<I> { fn draw<B: Graphics<Texture = I>>(&self, t: Matrix2d, b: &mut B) } 的{​​{1}}类型参数化Scene时,函数I将可用。 ImageSize使用类型draw进行参数化,该类型必须实现特征draw,其关联类型B设置为相同类型{{1 }}。 Graphics函数是对Texture的引用的方法,并且还有两个参数:IdrawScene,是对任何参数的可变引用具体类型t是。

为了能够致电Matrix2d,您的功能需要具有相同的限制,但您不能将b限制为与B相同。这样做允许代码编译:

draw