无法跟踪Rust中的类型期望错误

Hun*_*ter 2 rust sdl-2 rust-crates

存储库
https://github.com/hunterlester/rusty_arcade

版本
Rust:1.7.0
sdl2:0.16.1
sdl2_image:0.16.0

错误

src/views/mod.rs:88:13: 93:23 error: mismatched types:
 expected `core::option::Option<sdl2::rect::Rect>`,
    found `sdl2::rect::Rect`
(expected enum `core::option::Option`,
    found struct `sdl2::rect::Rect`) [E0308]
src/views/mod.rs:88             Rectangle {
src/views/mod.rs:89                 x: 0.0,
src/views/mod.rs:90                 y: 0.0,
src/views/mod.rs:91                 w: self.player.rect.w,
src/views/mod.rs:92                 h: self.player.rect.h,
src/views/mod.rs:93             }.to_sdl(),
src/views/mod.rs:88:13: 93:23 help: run `rustc --explain E0308` to see  a detailed explanation
src/views/mod.rs:94:13: 94:38 error: mismatched types:
 expected `core::option::Option<sdl2::rect::Rect>`,
    found `sdl2::rect::Rect`
(expected enum `core::option::Option`,
    found struct `sdl2::rect::Rect`) [E0308]
src/views/mod.rs:94             self.player.rect.to_sdl()
Run Code Online (Sandbox Code Playgroud)

跟踪
指定文件的第93和94行.

phi.renderer.copy(&mut self.player.tex,
            Rectangle {
                x: 0.0,
                y: 0.0,
                w: self.player.rect.w,
                h: self.player.rect.h,
            }.to_sdl(), // Line 93
            self.player.rect.to_sdl() // Line 94
        );
Run Code Online (Sandbox Code Playgroud)

我假设这与.to_sdl()方法返回的内容有关.

to_sdl方法

impl Rectangle {
    pub fn to_sdl(self) -> SdlRect {
        assert!(self.w >= 0.0 && self.h >= 0.0);

        SdlRect::new(self.x as i32, self.y as i32, self.w as u32,  self.h as u32)
    }
Run Code Online (Sandbox Code Playgroud)

to_sdl返回一个在文件顶部使用的SdlRect:

use sdl2::rect::Rect as SdlRect;
Run Code Online (Sandbox Code Playgroud)

sdl2 source
https://github.com/AngryLawyer/rust-sdl2/blob/master/src/sdl2/rect.rs

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Rect {
    raw: ll::SDL_Rect,
}

impl Rect {

pub fn new(x: i32, y: i32, width: u32, height: u32) -> Rect {
    let raw = ll::SDL_Rect {
        x: clamp_position(x),
        y: clamp_position(y),
        w: clamp_size(width) as i32,
        h: clamp_size(height) as i32,
    };
    Rect { raw: raw }
}
Run Code Online (Sandbox Code Playgroud)

我没有看到sdl2::rect::Rect预期在core::option::Option枚举类型中包含的位置.

如果您恰好熟悉我正在关注的教程,您会注意到我使用的是sdl2_image与教程中指定的版本不同的版本,因为指定的版本已从Crates中删除.

sdl2_image取决于sdl2我必须匹配的不同版本,以便处理其他错误.

oli*_*obk 6

该错误意味着表达式self.player.rect.to_sdl()产生一个SdlRect,但无论使用该值,都应该给出一个Option<SdlRect>.您正在调用copyof sdl2::render::Renderer,其中包含以下参数:

&mut self, texture: &Texture, src: Option<Rect>, dst: Option<Rect>
Run Code Online (Sandbox Code Playgroud)

如你所见,你需要传递两个Option<Rect>s.sdl-crate的文档甚至说明了原因:

将纹理的一部分复制到当前渲染目标.

  • 如果srcNone,则复制整个纹理.
  • 如果dstNone,则将拉伸纹理以填充给定的矩形.