срок службы с закрытием захватывает в ржавчине - PullRequest
1 голос
/ 29 сентября 2019

Как я могу сократить время жизни замыкания?

Я пытался создать метод, который возвращает итератор, связанный с self.Я не хотел создавать новую структуру или что-то в этом роде, поэтому я просто заставил ее возвращать фильтры и карты и столкнулся с некоторыми ошибками проверки заимствований.

Следующий код был моей первой попыткой.

fn f<'b>(&'b self) -> impl Iterator<Item = u8> {
    (0..self.some_number())
        .filter(|&i| self.some_bool_function(i))
        .map(|i| i as u8)
}

Следующий код повторяет мой вопрос.

struct A(bool);

impl A {
    fn f<'a>(&'a self) -> impl Iterator<Item = u8> + 'a {
        (0..1).filter(|&i| self.0)
    }
}

или даже короче,

fn g<'a>(t:&'a ()) -> impl 'a + FnMut() {
    || *t
}

Это не скомпилируется, потому что замыкание может пережить себя.Я не знаю, как заставить это работать, не двигаясь.

1 Ответ

0 голосов
/ 29 сентября 2019

Если вы возвращаете закрытие, вы должны убедиться, что закрытие имеет все, что ему нужно - даже после возврата (т.е. после того, как (временные) параметры функции извлечены из стека).

Таким образом, я думаю, вы хотите move материал, который вы возвращаете в замыкание:

impl A {
    fn f<'a>(&'a self) -> impl Iterator<Item = u8> + 'a {
        (0..1).filter(move |&i| self.0)
    }
}

Респ.

fn g<'a>(t:&'a ()) -> impl 'a + FnMut() {
    move || *t
}

Респ (расширение вашего первого примера):

struct A(bool);

impl A {
    fn some_number(&self) -> usize {
        6
    }
    fn some_bool_function(&self, i: usize) -> bool {
        i%2==0
    }

    fn f<'b>(&'b self) -> impl Iterator<Item = u8> + 'b {
        (0..self.some_number())
            .filter(move |&i| self.some_bool_function(i))
            .map(|i| i as u8)
    }
}
...