В следующем коде метод Worker::work
передается функции run_worker_method
, но, похоже, он конфликтует с параметром времени жизни блока impl<'a>
, в котором определено Worker::work
. Однако перенос Worker::work
в кажущуюся избыточной функцию call_worker_work
работает. Как правильно / более кратко обрабатывать параметры времени жизни блока impl<'a>
?
pub struct Worker<'a> {
config: &'a i32,
}
impl<'a> Worker<'a> {
pub fn work(&mut self) {
/* ... */
}
}
pub fn run_worker_method<F>(f: F)
where
F: Fn(&mut Worker),
{
// the following has no impact; given for illustration
let config = 0;
let mut worker = Worker { config: &config };
f(&mut worker);
}
pub fn use_run_worker_method() {
// How to make this line compile?
run_worker_method(Worker::work);
// This does compile.
run_worker_method(call_worker_work);
run_worker_method(|worker /*considerable parameter list*/|
worker.work(/*considerable parameter list*/));
}
pub fn call_worker_work(worker: &mut Worker) {
worker.work()
}
Сообщение компилятора:
error[E0308]: mismatched types
--> src/lib.rs:23:5
|
23 | run_worker_method(Worker::work);
| ^^^^^^^^^^^^^^^^^ one type is more general than the other
|
= note: expected type `std::ops::FnOnce<(&mut Worker<'_>,)>`
found type `for<'r> std::ops::FnOnce<(&'r mut Worker<'_>,)>`