Невозможно отследить ошибку ожидания типа в Rust
вместилище
https://github.com/hunterlester/rusty_arcade
Версии
Ржавчина: 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()
Отслеживание это вниз
Строки 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
);
Я предполагаю, что это как-то связано с тем, что .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)
}
to_sdl возвращает SdlRect, который используется вверху файла:
use sdl2::rect::Rect as SdlRect;
источник sdl2
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 }
}
Я не вижу где sdl2::rect::Rect
ожидается завернуть в core::option::Option
тип enum.
Если вам знакомо учебное пособие, которому я следую, вы заметите, что я использую другую версию sdl2_image
чем указано в учебнике, потому что указанный был выдернут из ящиков.
sdl2_image
зависит от другой версии sdl2
что я должен был соответствовать, чтобы позаботиться о других ошибках.
1 ответ
Ошибка означает, что выражение self.player.rect.to_sdl()
дает SdlRect
, но то, что использует это значение, ожидает получить Option<SdlRect>
, Вы звоните copy
из sdl2::render::Renderer
, который имеет следующие аргументы:
&mut self, texture: &Texture, src: Option<Rect>, dst: Option<Rect>
Как видите, нужно пройти два Option<Rect>
s. В документации sdl-crate даже сказано, почему:
Копирует часть текстуры в текущую цель рендеринга.
- Если
src
являетсяNone
, вся текстура скопирована.- Если
dst
являетсяNone
, текстура будет растянута, чтобы заполнить данный прямоугольник.