Как обработать время жизни для указателей на методы? - PullRequest
0 голосов
/ 26 мая 2020

В следующем коде метод 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<'_>,)>`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...