Я пытаюсь изучить Rust с помощью игрушечного проекта под названием workers. Я пытаюсь запустить task.perform()
внутри пула потоков.
Проблема:
Compiling workers v0.1.0 (file:///Users/endel/Projects/rust/workers)
src/lib.rs:45:21: 45:32 error: cannot infer an appropriate lifetime for autoref due to conflicting requirements
src/lib.rs:45 let next = self.next_task();
^~~~~~~~~~~
src/lib.rs:45:16: 45:20 note: first, the lifetime cannot outlive the expression at 45:15...
src/lib.rs:45 let next = self.next_task();
^~~~
src/lib.rs:45:16: 45:20 note: ...so that auto-reference is valid at the time of borrow
src/lib.rs:45 let next = self.next_task();
^~~~
src/lib.rs:45:16: 45:32 note: but, the lifetime must be valid for the method call at 45:15...
src/lib.rs:45 let next = self.next_task();
^~~~~~~~~~~~~~~~
src/lib.rs:45:16: 45:20 note: ...so that method receiver is valid for the method call
src/lib.rs:45 let next = self.next_task();
^~~~
error: aborting due to previous error
Я обратился за помощью в IRC-канал #rust, и они предложили использовать Box<Task>
(принадлежащий) вместо &Box<Task>
(заимствованный), чтобы скопировать задачу во время оператора move || {}
, я полагаю.
Это жизнеспособное решение? Есть какой-нибудь другой? Я попытался изменить методы реализации Worker
с &self
на self
, но начинают появляться другие проблемы, и я не могу получить собственный Box<Task>
для своего метода work
.
Вот упрощенная версия на площадке, демонстрирующая проблему.