Я использую следующий код для запуска моей функции render::exec
при каждом возникновении события RedrawRequested
(выпущенного Glium):
event_loop.run(move |event, _, control_flow| {
match event {
Event::RedrawRequested(_) => {
let mut target = display.draw();
render::exec(&mut target, &mut ctx, &font, &mut cache);
target.finish().unwrap();
}
// ...
_ => ()
}
});
Проблема в том, что я получение следующей ошибки в ссылке &font
:
borrowed data cannot be stored outside of its closure
font
действительно создается перед вызовом event_loop.run
, поскольку это структура rusttype::Font
, которая мне нужна для отображения текста внутри моего приложения Glium. Я понимаю, что, поскольку это закрытие move
, данные из font
будут освобождены в конце, поэтому средство проверки заимствований не позволяет создавать font
вне закрытия, потому что это не гарантирует, что закрытие не будет вызываться более одного раза (и действительно, вызывается более одного раза).
Я попытался обойти это, удалив move
ключевое слово, но затем возникает следующая ошибка для каждой из переменных, которые я заимствую из закрытия:
closure may outlive the current function, but it borrows `ctx`, which is owned by the current function
may outlive borrowed value `ctx`
Я понимаю, что, поскольку средство проверки заимствований не может гарантировать, что эти переменные прослужат как минимум до тех пор, пока закрытие, оно не позволит ссылаться на последнее изнутри первого.
Следовательно, Мне нужен способ гарантировать, что эти переменные будут длиться как минимум до закрытия . Один из способов сделать это обычно - передать их в качестве параметров в закрытие, но я фактически не могу изменить список передаваемых параметров, так как я использую event_loop.run
, который имеет следующую сигнатуру:
pub fn run<F>(self, event_handler: F) -> !
where F: 'static + FnMut(Event<'_, T>, &EventLoopWindowTarget<T>, &mut ControlFlow)
Я просмотрел документацию Glutin и не смог найти способ сохранить какие-либо данные в EventLoop
(это тип, который дает разыменование EventLoopWindowTarget
), ни в ControlFlow
, который передается как параметр