2017-08-10 13 views
1

私はPistonとSpriteを使って個人的なプロジェクトを進めています。私はすべてを描画するメソッドを呼び出ししようとしていますスプライト::シーン::描画を呼び出すときの型の不一致

scene.draw(c.transform, g); 

example codeこのメソッドを呼び出し。 は、私が最初に試さ:

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

その後、コンパイラは型が実装する必要があると私に語った:

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

を次にコンパイラは、私はので、私はこれを試してみましたSceneに型パラメータを与える必要が私に語りましたトレイト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>> ですが、メソッドのシグネチャには書きたくありません。

私は、2つの質問がある:

  1. は何コンパイラが私に教えしようとしていますか?
  2. シーンにメソッドを渡すにはどうすればよいですか?

答えて

1

drawの定義である:SceneImageSizeを実装タイプIでパラメータ化された場合、機能drawが使用可能になる

:すなわち

impl<I: ImageSize> Scene<I> { 
    fn draw<B: Graphics<Texture = I>>(&self, t: Matrix2d, b: &mut B) 
} 

、これは概ね相当します。 drawIとして同じタイプに関連するタイプTextureセットで形質Graphicsを実装しなければならないタイプBでパラメータ化されます。 draw関数はSceneを参照するメソッドであり、tMatrix2dおよびbの2つの引数をとります。具体的な型はBです。

drawを呼び出すには、関数に同じ制限が必要ですが、SGraphics::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() {} 
関連する問題