调用时类型不匹配 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>> 但我不想把它写在方法的签名中。

那我有两个问题:

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

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 设置为 相同的类型Idraw 函数是一个对 Scene 的引用的方法,它还有两个参数:tMatrix2db,一个对任何内容的可变引用具体类型 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() {}