调用时类型不匹配 sprite::Scene::draw
Type mismatch when calling sprite::Scene::draw
我正在使用 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>)
然后编译器告诉我该类型需要实现特征 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>>
但我不想把它写在方法的签名中。
那我有两个问题:
- 编译器试图告诉我什么?
- 如何将场景传递给方法?
draw
的定义是:
impl<I: ImageSize> Scene<I> {
fn draw<B: Graphics<Texture = I>>(&self, t: Matrix2d, b: &mut B)
}
换句话说,这大致对应于:
当 Scene
使用实现 ImageSize
的类型 I
进行参数化时,函数 draw
将可用。 draw
使用类型 B
进行参数化,该类型必须实现特征 Graphics
,关联类型 Texture
设置为 与 相同的类型I
。 draw
函数是一个对 Scene
的引用的方法,它还有两个参数:t
、Matrix2d
和 b
,一个对任何内容的可变引用具体类型 B
是.
为了能够调用 draw
,您的函数需要具有相同的限制,但您并未将 S
限制为与 Graphics::Texture
相同。这样做允许代码编译:
extern crate sprite;
extern crate graphics;
use graphics::{Graphics, ImageSize, Context};
use sprite::Scene;
struct X;
impl X {
fn draw<G>(&self, c: &Context, g: &mut G, scene: &mut Scene<G::Texture>)
where
G: Graphics,
{
scene.draw(c.transform, g);
}
}
fn main() {}
我正在使用 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>)
然后编译器告诉我该类型需要实现特征 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>>
但我不想把它写在方法的签名中。
那我有两个问题:
- 编译器试图告诉我什么?
- 如何将场景传递给方法?
draw
的定义是:
impl<I: ImageSize> Scene<I> {
fn draw<B: Graphics<Texture = I>>(&self, t: Matrix2d, b: &mut B)
}
换句话说,这大致对应于:
当 Scene
使用实现 ImageSize
的类型 I
进行参数化时,函数 draw
将可用。 draw
使用类型 B
进行参数化,该类型必须实现特征 Graphics
,关联类型 Texture
设置为 与 相同的类型I
。 draw
函数是一个对 Scene
的引用的方法,它还有两个参数:t
、Matrix2d
和 b
,一个对任何内容的可变引用具体类型 B
是.
为了能够调用 draw
,您的函数需要具有相同的限制,但您并未将 S
限制为与 Graphics::Texture
相同。这样做允许代码编译:
extern crate sprite;
extern crate graphics;
use graphics::{Graphics, ImageSize, Context};
use sprite::Scene;
struct X;
impl X {
fn draw<G>(&self, c: &Context, g: &mut G, scene: &mut Scene<G::Texture>)
where
G: Graphics,
{
scene.draw(c.transform, g);
}
}
fn main() {}