apply_async
- метод, который принимает &self
. Это означает, что self
является ссылкой, которая гарантированно будет действовать только в течение вызова до apply_async
. Закрытие move || self.apply(datum)
захватывает self
, время жизни и все, что означает, что оно не 'static
. Вот почему вы не можете вызвать spawn
для него.
Если Doer
реализует Clone
, один из способов решить эту проблему - сделать клон из *self
и move
в закрытие.
fn apply_async(&self, datum: String) -> JoinHandle<String> {
let s = self.clone();
return spawn(move || s.apply(datum));
}
Если вы не хотите клонировать целое Doer
, вы можете скопировать только необходимые части и переопределить apply
внутри apply_async
, например:
fn apply_async(&self, datum: String) -> JoinHandle<String> {
let f = self.f;
return spawn(move|| f(datum));
}