Закрытие идентичности на ссылках - PullRequest
1 голос
/ 13 октября 2019

У меня есть функция, которая принимает закрытие. Закрытие берет ссылку и возвращает любой тип K:

fn take_closure<T, K>(f: impl FnMut(&T)->K) {/*...*/}

Если я вызываю take_closure с функцией идентификации, то есть

struct S;
fn test() {
    take_closure(|s: &S| s)
}

, компилятор жалуется:

error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements

Я думаю, проблема в том, что K - это один единственный тип, но замыкание должно работать на все времена жизни, так что результат замыкания должен быть примерно таким: K + '(lifetime of closure parameter).

Указание этого K живет до тех пор, пока &T на самом деле не помогает:

fn take_closure<'a, T: 'a + Default, K: 'a>(mut f: impl FnMut(&'a T)->K) {
    let t = Default::default();
    f(&t); // error[E0597]: `t` does not live long enough
}

Таким образом, я попробовал границы черт более высокого ранга:

fn take_closure<F, T: Default, K>(mut f: F)
    where for<'a> F: FnMut(&'a T)->K // <- (how) can I specify that K: 'a 
{
    let t = Default::default();
    f(&t);
}

#[derive(Default)]
struct S;
fn test() {
    take_closure(|s: &S| s) // error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
}

Есть ли способ указать take_closure соответственно? Т.е. можно ли как-то указать, что for<'a>, мой FnMut(&'a T) производит K, удовлетворяющий сроку жизни 'a?

1 Ответ

0 голосов
/ 13 октября 2019

Вы можете указать при объявлении своей функции, что K не должен пережить &T:

fn take_closure<'a, T: 'a, K: 'a>(f: impl FnMut(&'a T)->K) {}

struct S;
fn test() {
    take_closure(|s: &S| s)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...