У меня есть функция, которая принимает закрытие. Закрытие берет ссылку и возвращает любой тип 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
?