The following code doesn't compile (as expected):
use sdl2::event::Event;
use sdl2::pixels::Color;
pub fn main() {
let sdl_context = sdl2::init().unwrap();
let video_subsystem = sdl_context.video().unwrap();
let window = video_subsystem
.window("rust-sdl2 demo", 800, 600)
.build()
.unwrap();
let mut canvas = window.into_canvas().build().unwrap();
canvas.set_draw_color(Color::RGB(0, 0, 0));
canvas.clear();
canvas.present();
let mut event_pump = sdl_context.event_pump().unwrap();
let keyboard = sdl2::keyboard::KeyboardState::new(&event_pump);
'running: loop {
if keyboard.is_scancode_pressed(sdl2::keyboard::Scancode::Space) {
println!("test");
}
for event in event_pump.poll_iter() {
match event {
Event::Quit { .. } => break 'running,
_ => {}
}
}
}
}
The compiler shows this error message:
error[E0502]: cannot borrow `event_pump` as mutable because it is also borrowed as immutable
--> src\main.rs:25:22
|
19 | let keyboard = sdl2::keyboard::KeyboardState::new(&event_pump);
| ----------- immutable borrow occurs here
...
22 | if keyboard.is_scancode_pressed(sdl2::keyboard::Scancode::Space) {
| ------------------------------------------------------------- immutable borrow later used here
...
25 | for event in event_pump.poll_iter() {
| ^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here
Why does it compile if I move the let keyboard
line inside the loop? I guess it has probably something to do with the lifetime of the objects. But the error it shows doesn't make sense to me. From my understanding, I don't see why it matters if let keyboard
is outside or inside the loop.