Как вернуть черту Iterator с изменяемым ref как Item? - PullRequest
1 голос
/ 02 ноября 2019

Я пытаюсь вернуть черту Iterator с изменяемым реф как item. И я не могу понять, почему у меня эта ошибка компилятора cannot infer an appropriate lifetime for lifetime parameter in function call due to conflicting requirements, а также expected &mut T, found &mut T для этого кода:

pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut T> {
    self.handles
        .iter_mut()
        .filter(|h| h.is_dirty == false)
        .map(move |h| &mut self.data[h.value])
}

Кроме того, его неизменная версия хорошо работает без каких-либо ошибок компилятора:

pub fn iter(&self) -> impl Iterator<Item = &T> {
    self.handles
        .iter()
        .filter(|h| h.is_dirty == false)
        .map(move |h| &self.data[h.value])
}

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

Я настраиваю игровую площадку здесь https://play.rust -lang.org /? Version = stable & mode = debug & edition = 2018 & gist = 3e399936f341d26c742a5e7e0bac4d89 (L138).

Также,Я пытался реализовать метод iter_mut() самостоятельно (как https://doc.rust -lang.org / src / core / slice / mod.rs.html # 560 ), но безуспешно. Та же самая ошибка, и даже если я обойду эту ошибку, будет определена область handles, поэтому время жизни не будет следовать.

pub fn iter_mut(&mut self) -> IterMut<'_, &T> {
    let handles: Vec<&T> = self.handles
        .iter()
        .filter(|h| h.is_dirty == false)
        .map(move |h| &self.data[h.value])
        .collect();

    unsafe {
        let ptr = handles.as_mut_ptr();
        let end = ptr.add(handles.len());

        IterMut {
            ptr,
            end,
            _marker: marker::PhantomData
        }

    }
}

Если кто-то из вас имеет представление об этой ошибке, не стесняйтесь! :) Спасибо!

...