我正在使用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`
我不明白编译器在这里要说的是什么。完整类型Scene
为sprite::Scene<piston_window::Texture<gfx_device_gl::Resources>>
但是我不想在方法的签名中写出来。
我有两个问题:
答案 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
的引用的方法,并且还有两个参数:I
,draw
和Scene
,是对任何参数的可变引用具体类型t
是。
为了能够致电Matrix2d
,您的功能需要具有相同的限制,但您不能将b
限制为与B
相同。这样做允许代码编译:
draw