Проблема в том, что S
может быть любого типа с Scope
impl, который включает в себя все виды еще не существующих типов, которые содержат ссылки на другие типы. Например, у вас может быть такая реализация:
struct AnotherScope<'a> {
reference: &'str,
}
impl Scope for ScopeImpl {
fn run(&self) -> String {
self.reference.to_string()
}
}
Rust осторожен и хочет убедиться, что это будет работать для любой квалификации S
, в том числе, если он содержит ссылки.
Самое простое решение - сделать, как указано в примечании об ошибке, и просто запретить S
иметь нестатические ссылки:
fn new<S: Scope + 'static>(scope: S) -> Self {
ScopeRunner {
runner: Box::new(move || scope.run())
}
}
Связывание S
с 'static
фактически означает, что S
может содержать либо ссылки на значения со временем жизни 'static
, либо никаких ссылок вообще.
Если вы хотите быть более гибким, вы можете расширить его до ссылок, которые переживают сам ScopeRunner
:
struct ScopeRunner<'s> {
runner: Box<dyn Fn() -> String + 's>,
}
impl<'s> ScopeRunner<'s> {
fn new<S: Scope + 's>(scope: S) -> Self {
ScopeRunner {
runner: Box::new(move || scope.run())
}
}
pub fn run(self) -> String {
(self.runner)()
}
}